繁体   English   中英

我如何最好地使用UICollisionBehavior来检测视图何时不在屏幕上?

[英]How would I best use UICollisionBehavior to detect when a view is no longer on screen at all?

我正试图在UIKit Dynamics中使用UICollisionBehavior来弄清楚我从屏幕上抛出的视图(使用UIAttachmentBehaviorUIPushBehavior )实际上完全不在屏幕上。

我发现它很复杂,因为我无法跟踪它的进展,一旦它被抛出我试图找出使用UICollisionBehavior来检测它的最后一个边缘何时与其UICollisionBehavior视图“相撞”。 与NSTimer解决方案或类似的解决方案相比,这似乎是最简单的方法来判断它是否在屏幕外(但如果您能想到任何更简单的方法,我都会耳朵!)。

我在这个项目中看到的解决方案(具体在这里 )如下:

CGRect referenceBounds = self.animator.referenceView.bounds;
CGFloat inset = -hypot(CGRectGetWidth(referenceBounds), CGRectGetHeight(referenceBounds));
UIEdgeInsets edgeInsets = UIEdgeInsetsMake(inset, inset, inset, inset);
[self.collisionBehavior setTranslatesReferenceBoundsIntoBoundaryWithInsets:edgeInsets];

其中计算碰撞边界的位置我猜测(说实话我并不完全理解它)然后当检测到碰撞时调用委托时我调用removeFromSuperview

但无论出于何种原因,这都非常不可靠。 有时候我会把它扔掉屏幕,它实际上永远不会以某种方式调用碰撞检测到的委托。 通常时间也会有点晚。

就我的设置而言,它只是抛出一个UIScrollView关闭屏幕,其框架设置为其超级视图的边界(视图控制器中的self.view )。

有没有更好的方法来设置碰撞检测何时离开视图?

这个答案中,我将说明如何使用UIKit Dynamics处理离屏视图的拖动。 具体来说,我建议不要使用UICollisionBehavior (或NSTimer或其他),而是指定一个action块来检查视图何时不再相交。 这说明了使用UIDynamicItemBehavior时的想法,但这个想法适用于任何UIKit动态行为:

UIDynamicItemBehavior *dynamic = [[UIDynamicItemBehavior alloc] initWithItems:@[viewToAnimate]];
[dynamic addLinearVelocity:velocity forItem:viewToAnimate];
[dynamic addAngularVelocity:angularVelocity forItem:viewToAnimate];

// when the view no longer intersects with its superview, go ahead and remove it

typeof(self) __weak weakSelf = self;
dynamic.action = ^{
    if (!CGRectIntersectsRect(gesture.view.superview.bounds, gesture.view.frame)) {
        [weakSelf.animator removeAllBehaviors];
        [viewToAnimate removeFromSuperview];
    }
};

// now add dynamic behavior

[self.animator addBehavior:dynamic];

显然,您应该根据您的特定情况对其进行自定义,但希望它能够说明这一想法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM