[英]How would I best use UICollisionBehavior to detect when a view is no longer on screen at all?
我正试图在UIKit Dynamics中使用UICollisionBehavior
来弄清楚我从屏幕上抛出的视图(使用UIAttachmentBehavior
和UIPushBehavior
)实际上完全不在屏幕上。
我发现它很复杂,因为我无法跟踪它的进展,一旦它被抛出我试图找出使用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.