约束动画问题

Posted

技术标签:

【中文标题】约束动画问题【英文标题】:Constraint animation issue 【发布时间】:2016-02-05 13:46:52 【问题描述】:

我正在构建一个应用程序,但我遇到了一个奇怪的约束问题。

我正在尝试为情节提要中附加到 UIView 的高度约束设置动画,但模拟器显示了一些奇怪的行为。为了调试,我创建了一个全新的 ios 9.2 项目并添加了一个UIButton,为其设置了一个水平引脚和超级视图顶部约束,将顶部约束链接到我的头文件并将按钮本身链接到 IBAction

单独调用此代码时:

- (IBAction)myAction:(id)sender 
    self.topConstraint.constant += 150.0f;

即使没有调用[self.view layoutIfNeeded];,按钮也会向下捕捉 150 点。

但是,当我使用此代码时:

- (IBAction)myAction:(id)sender 
    self.topConstraint.constant += 150.0f;
    [self.view setNeedsUpdateConstraints];
    [UIView animateWithDuration:1 animations:^
        [self.view layoutIfNeeded];
    ];

按钮向下滑动。

当没有动画块时,它怎么会在没有我调用layoutIfNeeded 的情况下捕捉到那里?我觉得这很奇怪。

这是我的头文件:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

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

@end

还有我的***NSLayoutConstraint 设置:

还有界面生成器中的UIViewController

【问题讨论】:

如果需要,在布局的时候不需要调用set需要更新约束!!! @Mr.T,我明白了 - 我会改变它。感谢您的反馈。您知道为什么会出现我所面临的问题吗? 【参考方案1】:

在视图上调用 layoutIfNeeded 只是强制提前更新视图,而不是等待整个绘图周期的更新,当您为约束设置动画时,您将 layoutIfNeeded 放置在动画块内,从而在第二次为更改设置动画在不调用 layoutIfNeeded 的情况下,绘制周期会出现并更新没有动画的视图。

【讨论】:

我明白了。将不断变化的代码沿layoutIfNeeded放在动画块中会更合适吗? 我想让它动画化,但你用你的评论回答了这个问题。我想知道是否应该更改常量以及在同一动画块中调用layoutIfNeeded 不需要将常量放入动画块中。没有什么可以动画的。更改约束的常量并更新视图后,读取约束并相应更改视图。

以上是关于约束动画问题的主要内容,如果未能解决你的问题,请参考以下文章

动画 tableview 高度约束,但动画正在跳跃

约束动画问题

收缩高度约束动画问题

关于 iOS 约束更新动画 - 动画块 + layoutIfNeeded

宽度约束动画时UITextfield文本位置没有动画

约束动画之前的跳跃图像