最近我使用 UIDynamics 将图像视图动画化。然而,因为它的自动布局 y-pos 约束被设置为离屏,当导航离开屏幕然后返回它时,我的图像视图再次被放置在离屏。动画花了大约 3 秒,所以三秒后我只是重置了约束。感觉有点hacky。
所以我的问题是:同时处理自动布局和 UIDynamics 的正确方法是什么?
最近我使用 UIDynamics 将图像视图动画化。然而,因为它的自动布局 y-pos 约束被设置为离屏,当导航离开屏幕然后返回它时,我的图像视图再次被放置在离屏。动画花了大约 3 秒,所以三秒后我只是重置了约束。感觉有点hacky。
所以我的问题是:同时处理自动布局和 UIDynamics 的正确方法是什么?
这不是一个真正的动力学问题。自动布局与任何视图动画或框架的任何手动设置都不兼容:当布局出现时,将遵守约束。如果您以任何方式手动移动视图,则取决于您是否更新约束以匹配其新位置/大小/任何内容。
话虽如此:使用 UIKit Dynamics,当动画结束时,动画师会暂停,并通知动画师的委托:
所以现在是更新约束的时刻。
在本教程中,Geppy Parziale 提供了一个很好的解决方案。
基本上你可以创建一个符合 UIDynamicItem 的对象:
@interface DynamicHub : NSObject <UIDynamicItem>
@property(nonatomic, readonly) CGRect bounds;
@property(nonatomic, readwrite) CGPoint center;
@property(nonatomic, readwrite) CGAffineTransform transform;
@end
这需要初始化边界,否则它会崩溃:
- (id)init {
self = [super init];
if (self) {
_bounds = CGRectMake(0, 0, 100, 100);
}
return self;
}
然后在该对象上使用 UIDynamics 并使用中间值来更新约束:
DynamicHub *dynamicHub = [[DynamicHub alloc] init];
UISnapBehavior *snapBehavior = [[UISnapBehavior alloc] initWithItem:dynamicHub
snapToPoint:CGPointMake(50.0, 150.0)];
[snapBehavior setDamping:.1];
snapBehavior.action = ^{
self.firstConstraint.constant = [dynamicHub center].y;
self.secondConstraint.constant = [dynamicHub center].x;
};
[self.animator addBehavior:snapBehavior];