4

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

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

4

2 回答 2

5

这不是一个真正的动力学问题。自动布局与任何视图动画或框架的任何手动设置都不兼容:当布局出现时,将遵守约束。如果您以任何方式手动移动视图,则取决于您是否更新约束以匹配其新位置/大小/任何内容。

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

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

所以现在是更新约束的时刻。

于 2014-03-20T17:17:23.903 回答
3

在本教程中,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];
于 2014-08-08T11:24:29.630 回答