UIView 动画无法正常工作
Posted
技术标签:
【中文标题】UIView 动画无法正常工作【英文标题】:UIView animation works faulty 【发布时间】:2015-11-19 12:48:28 【问题描述】:我正在使用 Objective-C。当我在其上方添加搜索栏时,我想让表格视图随着动画向下移动。这是我的代码(这里的表格是我的表格视图):
[UIView animateWithDuration:0.3 animations:^
CGRect frame = self.table.frame;
frame.origin.y = frame.origin.y+30;
self.table.frame = frame;
];
但它不起作用。有人可以帮助我吗?
【问题讨论】:
如果您使用自动布局,则对框架的操作将不起作用或会出现问题。尝试使用转换。 user1963877 说得很好。 是的,转换作品,但它不是动画。还是谢谢。 【参考方案1】:在动画块的末尾添加 layoutIfNeeded。像这样:
[UIView animateWithDuration:0.3 animations:^
CGRect frame = self.table.frame;
frame.origin.y = frame.origin.y+30;
self.table.frame = frame;
[self.view layoutIfNeeded];
];
【讨论】:
不幸的是它不起作用。我发现table view会先上移再下移,这样就可以回到原来的地方了。 这行不通,因为框架和自动布局是不同的东西。 @HongxuJin 你使用自动布局吗? @HongxuJin 如果self.table
不是self.view
的子视图,请尝试改用[self.table layoutIfNeeded];
。【参考方案2】:
像这样改变框架并不是最好的方法,而且它已经过时了。最好的方法是访问视图上的自动布局约束之一,然后更改它。例如 - 假设您的 tableview 有一个顶部约束,它定义了 tableview 顶部和 superview 之间的间隙 - 例如 10px。将该约束从 IB 拖到您的班级中。最好的方法是突出显示 IB 左侧的约束,在包含所有视图等的列表中。拖动以使其成为类中的属性,就像使用按钮或标签一样。然后在运行时,更改该约束的 .constant 属性。例如。这是我拖入类时的 NSLayoutConstraint 属性:
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topBuffer;
然后在代码中您希望移动发生的位置,更改动画调用之外的常量属性:
self.topBuffer.constant = 50; //<-- or whatever the new value is
那么你所做的就是在动画块中调用[self.view layoutIfNeeded]。顺便说一句-注意这里我也使用了带有弹簧等的动画块来获得弹跳效果。另请注意 - layoutIfNeeded 在您正在更改的对象的超级视图上调用 - 所以 self.view 这里是我的主要超级视图,其中包含 tableview。
[UIView animateWithDuration:0.7f delay:0 usingSpringWithDamping:1.0 initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseIn animations:^(void) [self.view layoutIfNeeded]; completion:nil];
【讨论】:
谢谢,但一个新问题是我没有自动布局约束。我应该在某处添加它吗? 自动布局在 ios 应用中非常重要。你在用故事板吗?如果是这样,至少会更容易。最好看看一些初学者自动布局教程 - 你肯定会一直需要这些东西!例如:raywenderlich.com/115440/…以上是关于UIView 动画无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章