带有附件的 UIKit 动态行为平移不继续碰撞行为?

Posted

技术标签:

【中文标题】带有附件的 UIKit 动态行为平移不继续碰撞行为?【英文标题】:UIKit dynamic behavior pan with attachment not continuing collision behavior? 【发布时间】:2016-09-29 12:41:54 【问题描述】:

如何在UIDynamicItem 的盘上进行碰撞检测?

背景:我从一组颜色/字符串中随机生成 20 个标签(这部分不是问题的关键部分),然后将它们添加到具有随机中心位置的主视图中.从那里,我添加UIDynamicBehaviors,如下:

1) UIDynamicItemBehavior 停止标签旋转 2)UISnapBehavior 将标签捕捉到视图的中心(我想要类似重力的运动,但同样,这不是这个问题) 3) UICollisionBehavior 对于collisionMode.Items 的所有标签。

这适用于“初始”设置...所有标签出现在随机点,然后在中心快速对齐,并进行适当的碰撞检测。不过,我的问题是,我怎样才能移动标签(通过平移手势)以继续进行碰撞检测?

我在每个标签上设置了一个UIPanGestureRecognizer,当它们开始拖动时,我创建一个UIAttachmentBehavior,并在拖动时使用它来移动它们。这在标签移动的意义上“有效”,但它只会滑过所有其他标签而不会发生任何碰撞检测。我怎样才能实现这种碰撞检测,以便当我开始将一个标签拖向其他标签时,它们会移开刚好足以没有重叠(然后这些标签会根据中心重心点迅速回到它们的位置) ?我是否需要将UIAttachmentBehavior 附加到我为每个平底锅拖动的所有其他标签上?

我已经为我面临的问题创建了一个测试项目,它展示了我刚才描述的内容:

github test project

谢谢!

【问题讨论】:

【参考方案1】:

嗯,经过几个月的思考,我终于想到了一个解决方案,所以我想我以后会在这里发布它以供大家受益。

这通过一个简单的 SpriteKit 场景非常容易实现。我只是创建一个小的SKScene,将SKLabelNodes 添加到该场景中,使用我想要的任何文本/颜色/大小,然后添加一个SKFieldNoderadialGravityField。从那里,物理属性可以通过每个节点的physicsBody 属性进行播放,我可以通过插入场景的touchesBegan 方法并适当地移动适当的节点来完成所需的操作,并由物理引擎负责碰撞和弹跳对我来说。

【讨论】:

以上是关于带有附件的 UIKit 动态行为平移不继续碰撞行为?的主要内容,如果未能解决你的问题,请参考以下文章

模仿照片应用程序的平移行为(速度)

iOS 力学动画生成器UIKit Dynamics 之碰撞效果解说

带有附件和推送行为的 UIDynamicKit 会导致较长的振荡时间

将动态视图捕捉到屏幕顶部、底部或中间的统一行为

带有平移、旋转和捏合手势的 UIKit Dynamics

旋转后平移手势行为不正确