AutoLayout和animateWithDuration问题

时间:2013-05-17 17:56:42

标签: objective-c ios6 autolayout iphone-5

我正在为iPhone 5更大的屏幕更新我的iPhone应用程序,animateWithDuration:似乎有问题。在我打开自动布局之前,当UITextField成为第一响应者时,界面元素将在屏幕上稍微向上移动,并且当UITextField失去其第一响应者状态时,它将向下移回其原始位置。现在,他们只是偶然地飞起来离开屏幕,我不明白为什么。我使用下面的代码移动对象(这与autolayout关闭一起工作):

[UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
    int offset = 160;
    [object1 setFrame:CGRectMake(0, -offset, object1.frame.size.width, object1.frame.size.height)];
    [object2 setFrame:CGRectMake(object2.frame.origin.x, object2.frame.origin.y-offset, object2.frame.size.width, object2.frame.size.height)];
    [object3 setFrame:CGRectMake(object3.frame.origin.x, object3.frame.origin.y-offset, object3.frame.size.width, object3.frame.size.height)];
             }
                 completion:^(BOOL finished){}];

是否与尝试通过常量移动对象有关?即使我将offset设置为0,所有对象仍然会离开屏幕。我已经尝试检测设备有哪个屏幕并以不同的数量移动对象,但这也没有用。有没有人有任何想法?

提前致谢!

1 个答案:

答案 0 :(得分:2)

使用自动布局时,除非这些是使用translatesAutoresizingMaskIntoConstraints = YES手动添加到视图的对象,否则autolayout通常会通过更改框架来阻止尝试设置动画。如果存在任何会导致重新应用约束的内容,则对象将移回到约束条件应该存在的任何位置,从而覆盖您调整其frame属性的尝试。

如果在使用自动布局时动画显示此类对象的移动,您可以(a)为其顶部约束创建IBOutlet(如果调整y;如果调整x也是如此,你也可以使用前导约束,然后更改该约束的constant属性,然后从动画块中调用layoutIfNeeded;或(b)删除约束并创建新约束。 (我一般都是前者。)

请参阅this answer的后半部分,了解如何为约束创建IBOutlet,然后更改动画块中的constant属性。