如何使用自动布局在 UIScrollView 中为视图高度设置动画?
Posted
技术标签:
【中文标题】如何使用自动布局在 UIScrollView 中为视图高度设置动画?【英文标题】:How to animate view height within UIScrollView using autolayout? 【发布时间】:2018-10-19 11:08:47 【问题描述】:UIScrollView
包含三个子视图:UIView1
、UIView2
和 UIView3
。
UIView1
和UIView3
的高度由这些视图的内容使用自动布局约束定义。
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】:一个简单直接的解决方案是将您的 UIView1、UIView2 和 UIView3 包含在 UIStackView。
然后,您可以直接在 UIView 动画块内设置这 3 个视图中的任何一个的 hidden 属性,以动画化任何这些视图的外观。
[UIView animateWithDuration:0.25 animations:^
self.secondView.hidden = YES;
];
参考:UIStackView Documentation
【讨论】:
以上是关于如何使用自动布局在 UIScrollView 中为视图高度设置动画?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用情节提要和自动布局在 UIScrollView 中添加动态高度/空间元素? [复制]
UIScrollView 具有自动布局的错误 contentSize
如何使 UIScrollView 与自动布局和动态内容一起使用? [复制]
苹果自己关于如何使用自动布局制作水平滚动 UIScrollView 的说明不起作用?