UIView动画有效

时间:2015-11-19 12:48:29

标签: ios objective-c animation uiview

我正在使用Objective-C。当我在其上方添加搜索栏时,我想让表格视图向下移动动画。这是我的代码(这里的表是我的表视图):

[UIView animateWithDuration:0.3 animations:^{
    CGRect frame = self.table.frame;
    frame.origin.y = frame.origin.y+30;
    self.table.frame = frame;
}];

但它不起作用。有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

在动画块结束时添加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];
}];

答案 1 :(得分:0)

像这样改变帧不是最好的方法,而且它的老式。最好的方法是访问视图上的一个自动布局约束,并进行更改。例如 - 假设你的tableview有一个顶级约束,它定义了tableview顶部和superview之间的差距 - 例如10px。将该约束从IB拖入您的班级。最好的方法是在包含所有视图的列表中突出显示IB左侧的约束。拖动以使其成为类中的属性,就像使用按钮或标签一样。然后在运行时,更改该约束的.constant属性。例如。在拖入课程时,我的NSLayoutConstraint属性是:

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topBuffer;

然后在代码中您希望移动发生的位置,您更改动画调用的常量属性OUTSIDE:

self.topBuffer.constant = 50;  //<-- or whatever the new value is

然后你要做的就是在动画块中调用[self.view layoutIfNeeded]。顺便说一下 - 注意这里我已经使用了带弹簧等的动画块来获得弹跳效果。另请注意 - 在您正在更改的对象的超级视图上调用layoutIfNeeded - 所以self.view在这里是包含tableview的主要superview。

[UIView animateWithDuration:0.7f delay:0 usingSpringWithDamping:1.0 initialSpringVelocity:0 options:UIViewAnimationOptionCurveEaseIn animations:^(void) {[self.view layoutIfNeeded];} completion:nil];