【问题标题】:AutoLayout and animateWithDuration problemsAutoLayout 和 animateWithDuration 问题
【发布时间】:2013-05-12 23:36:56
【问题描述】:

我正在为 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){}];

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

提前致谢!

【问题讨论】:

标签: objective-c ios6 autolayout iphone-5


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多