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 动画无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

UIView 动画在 UITableViewCell 内无法正常工作

具有原点的动画 UIView 无法正常工作

UIStackView 显示/隐藏动画无法正常工作

UIView 动画在 iOS 8 中不能正常工作?

UIView 动画隐藏和显示

swift 3 layoutIfneeded 无法正常工作