最近,我使用UIDynamics将图像视图设置为动画。但是,因为它的自动布局y-pos约束被设置为屏幕外,当从屏幕导航然后返回到它时,我的图像视图再次被放置在屏幕外。动画花了大约3秒钟,所以三秒后我就重置了约束。感觉有点蠢。
所以我的问题是:同时处理autolayout和UIDynamics的正确方法是什么?
答案 0 :(得分:5)
这不是一个真正的动态问题。 Autolayout与任何视图动画或框架的任何手动设置不兼容:当布局出现时,将遵循约束 。如果您以任何方式手动移动视图,更新约束以匹配其新位置/大小/等等,由您决定。
话虽如此:使用UIKit Dynamics,当动画结束时,动画师会暂停,并通知动画师的代表:
这是更新约束的时刻。
答案 1 :(得分:4)
Geppy Parziale在this tutorial中提供了一个很好的解决方案。
基本上,您可以创建符合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];