gpt4 book ai didi

objective-c - 我如何最好地使用 UICollisionBehavior 来检测 View 何时不再显示在屏幕上?

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:22 25 4
gpt4 key购买 nike

我正在尝试在 UIKit Dynamics 中使用 UICollisionBehavior 来确定我何时将 View 抛出屏幕(使用 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];

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

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

就我的设置而言,它只是将 UIScrollView 抛出屏幕,其框架设置为其 super View 的边界( View Controller 中的 self.view)。

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

最佳答案

this answer我演示了如何使用 UIKit Dynamics 处理 View 外的拖动。具体来说,与其使用 UICollisionBehavior(或 NSTimer 或其他),我建议指定一个 action block 来检查 View 何时不再相交。这说明了使用 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];

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

关于objective-c - 我如何最好地使用 UICollisionBehavior 来检测 View 何时不再显示在屏幕上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21977766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com