UIDynamics和Autolayout

时间:2014-03-20 17:12:38

标签: ios objective-c autolayout uikit-dynamics

最近,我使用UIDynamics将图像视图设置为动画。但是,因为它的自动布局y-pos约束被设置为屏幕外,当从屏幕导航然后返回到它时,我的图像视图再次被放置在屏幕外。动画花了大约3秒钟,所以三秒后我就重置了约束。感觉有点蠢。

所以我的问题是:同时处理autolayout和UIDynamics的正确方法是什么?

2 个答案:

答案 0 :(得分:5)

这不是一个真正的动态问题。 Autolayout与任何视图动画或框架的任何手动设置不兼容:当布局出现时,将遵循约束 。如果您以任何方式手动移动视图,更新约束以匹配其新位置/大小/等等,由您决定。

话虽如此:使用UIKit Dynamics,当动画结束时,动画师会暂停,并通知动画师的代表:

https://developer.apple.com/library/ios/documentation/uikit/reference/UIDynamicAnimatorDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIDynamicAnimatorDelegate/dynamicAnimatorDidPause

这是更新约束的时刻。

答案 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];