UIKit 动力学

使用 UIKit Dynamics 时要记住的一个重要事项是动画师定位的视图无法通过其他常见的 iOS 布局方法轻松定位。

UIKit Dynamics 的新人经常在这个重要的警告中挣扎。将约束放在也是 UIDynamicBehavior 的项目的视图上可能会引起混淆,因为自动布局引擎和动态动画制作引擎都在适当的位置上进行战斗。类似地,尝试直接设置由动画制作者控制的视图的帧通常会导致抖动动画和意外放置。将视图作为项目添加到 UIDynamicBehavior 意味着动画师将承担定位视图的责任,因此应通过动画师实现视图位置的更改。

可以设置由动态动画制作者更新的视图框架,但是应该立即向动画师发送消息以更新动画制作者的视图层次结构的内部模型。例如,如果我有 UILabellabelUIGravityBehavior 的项目,我可以将它移动到屏幕顶部,通过说:

迅速

label.frame = CGRect(x: 0.0, y: 0.0, width: label.intrinsicContentSize.width, height: label.intrinsicContentSize.height)
dynamicAnimator.updateItem(usingCurrentState: label)

Objective-C

self.label.frame = CGRectMake(0.0, 0.0, self.label.intrinsicContentSize.width, self.label.intrinsicContentSize.height);
[self.dynamicAnimator updateItemUsingCurrentState: self.label];

之后,动画师将从标签的新位置应用重力行为。

另一种常见技术是使用 UIDynamicBehaviors 来定位视图。例如,如果需要在触摸事件下定位视图,则创建 UIAttachmentBehavior 并在 touchesMovedUIGestureRecognizer 的动作中更新其 anchorPoint 是一种有效的策略。