1

我正在为 iPhone 5 的大屏幕更新我的 iPhone 应用程序,但animateWithDuration:. 在我打开自动布局之前,当 UITextField 成为第一响应者时,界面元素会在屏幕上略微向上移动,而当 UITextField 失去其第一响应者状态时,界面元素会向下移动回原来的位置。现在,它们只是随意地在屏幕上飞来飞去,我不知道为什么。我使用下面的代码移动对象(这在关闭自动布局的情况下工作):

[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){}];

它与尝试将对象移动一个常数有关吗?即使我设置offset0,所有对象仍会飞出屏幕。我已经尝试检测设备具有哪个屏幕并将对象移动不同的量,但这也没有奏效。有人有什么想法吗?

提前致谢!

4

1 回答 1

2

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

如果在使用自动布局时像这样为对象的移动设置动画,您可以(a)IBOutlet为其顶部约束创建一个(如果正在调整y;如果x也在调整,您也将使用前导约束),然后更改该约束的constant属性,然后调用layoutIfNeeded从动画块内;或 (b) 移除约束并创建新约束。(我一般是前者。)

有关如何创建约束然后更改动画块中的属性的示例,请参阅此答案的后半部分。IBOutletconstant

于 2013-05-17T18:11:53.727 回答