如何使用自动布局在 UIScrollView 中为视图高度设置动画?

Posted

技术标签:

【中文标题】如何使用自动布局在 UIScrollView 中为视图高度设置动画?【英文标题】:How to animate view height within UIScrollView using autolayout? 【发布时间】:2018-10-19 11:08:47 【问题描述】:

UIScrollView 包含三个子视图:UIView1UIView2UIView3

UIView1UIView3 的高度由这些视图的内容使用自动布局约束定义。

UIView2 的高度也由它的子视图定义。不过应该可以切换UIView2的可见性

Button 被按下时,UIView2 应该折叠到高度为 0(动画)。当再次按下Button 时,UIView2 应该被动画化回原来的高度。

我该怎么做(在 Objsctiv-C 中)?

如果UIView2 的高度是固定的,那么将高度约束从 0 设置为固定值(例如 100)将没有问题,反之亦然。但由于高度不是固定的,而是取决于子视图,我不知道UIView2 的确切高度。 如何解决?

【问题讨论】:

【参考方案1】:

创建两个约束,一个用于高度,另一个用于顶部空间,如您的 .h 文件中的以下内容

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *view2HeightConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *view2TopSpaceFromView1;

在您的 .m 文件中创建如下所示的操作

- (IBAction)toggleButtonTapped:(id)sender 
UIButton *btn =  (UIButton *)sender;
if ([btn isSelected])

    [btn setSelected:false];
    _view2HeightConstraint.constant = 45.0;
    _view2TopSpaceFromView1.constant = 8.0;


else
    [btn setSelected:true];
    _view2HeightConstraint.constant = 0.0;
    _view2TopSpaceFromView1.constant = 0.0;


【讨论】:

【参考方案2】:

您可以创建 2 个约束

1- View2 高度限制 = 0 => 优先级 = 999

2- 对 View2 的 SubView3 底部约束 => 优先级 = 1000

当你想隐藏视图 2 切换优先级和动画

【讨论】:

【参考方案3】:

一个简单直接的解决方案是将您的 UIView1UIView2UIView3 包含在 UIStackView

然后,您可以直接在 UIView 动画块内设置这 3 个视图中的任何一个的 hidden 属性,以动画化任何这些视图的外观。

[UIView animateWithDuration:0.25 animations:^
    self.secondView.hidden = YES;
];

参考:UIStackView Documentation

【讨论】:

以上是关于如何使用自动布局在 UIScrollView 中为视图高度设置动画?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用情节提要和自动布局在 UIScrollView 中添加动态高度/空间元素? [复制]

UIScrollView 具有自动布局的错误 contentSize

如何使 UIScrollView 与自动布局和动态内容一起使用? [复制]

苹果自己关于如何使用自动布局制作水平滚动 UIScrollView 的说明不起作用?

如何在具有自动布局的操作上自动增加 UIScrollView 中的内容大小?

如何让 UIScrollView 适合其内容大小,直到在自动布局中滚动之前达到最大值