【问题标题】:How would I best use UICollisionBehavior to detect when a view is no longer on screen at all?我如何最好地使用 UICollisionBehavior 来检测视图何时不再出现在屏幕上?
【发布时间】:2014-03-25 12:36:54
【问题描述】:

我正在尝试在 UIKit Dynamics 中使用 UICollisionBehavior 来确定我已从屏幕上抛出的视图(使用 UIAttachmentBehaviorUIPushBehavior)实际上完全在屏幕外。

我发现它很复杂,因为我无法跟踪它的进展,一旦它被抛出,我试图找出使用UICollisionBehavior 来检测它的最后一条边何时与其超级视图“碰撞”。与 NSTimer 解决方案或类似解决方案相比,这似乎是确定它何时不在屏幕上的最简单方法(但如果您能想到任何更简单的方法,我会全力以赴!)。

我在this project(特别是here)看到的一个解决方案如下:

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)。

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

【问题讨论】:

    标签: objective-c cocoa-touch ios7 uikit-dynamics uicollisionbehavior


    【解决方案1】:

    this answer 中,我说明了如何使用 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];
    

    显然,您应该自定义它以适合您的特定场景,但希望它能说明这个想法。

    【讨论】:

    • 在这样的块中捕获self值得担心吗?
    • 在实践中,引用self 可能没问题(因为一旦行为被删除,循环就解决了),但是使用weakSelf 模式可能是谨慎的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2021-04-16
    • 2020-12-11
    相关资源
    最近更新 更多