修改父视图frame时子视图未自动调整的问题求助
问题分析与解决方案
嘿,我看你遇到了子视图不跟随父视图尺寸变化的问题,核心原因是你搞混了Auto Layout约束和Autoresizing Mask的工作逻辑,再加上代码里的设置对象搞错了,所以之前的尝试都没起作用。
为啥你的现有方案没效果?
- 你在代码里给
viewA设置了autoresizingMask,但需要调整尺寸的是子视图viewB啊!这个设置完全没作用在目标视图上,等于白忙活 - 你是在Storyboard里给
viewB加了Auto Layout约束的,这时候系统会自动把autoresizingMask转换成对应的约束,手动改autoresizingMask根本覆盖不了Storyboard里已经存在的约束 - 修改
viewA的bounds/frame本身没问题,但如果viewB的约束没和viewA的边缘绑定,它当然不会跟着变
正确的解决办法
方案1:调整Storyboard约束(最推荐,符合iOS布局最佳实践)
从你提供的viewB约束截图来看,你得确保viewB的约束是和viewA的边缘绑定的,而不是固定尺寸或者绑定到其他父视图:
- 选中
viewB,添加这四个约束:- 顶部与
viewA顶部间距为0(或者你想要的间距) - 底部与
viewA底部间距为0 - 左侧与
viewA左侧间距为0 - 右侧与
viewA右侧间距为0
这样一来,不管viewA的尺寸怎么变,viewB都会自动填充viewA的整个区域,连代码都不用额外写。
- 顶部与
方案2:改用Autoresizing Mask(不推荐,除非你明确不需要Auto Layout)
如果你不想用Auto Layout,想用Autoresizing Mask的话,得做两步:
- 先在Storyboard里选中
viewB,删掉所有已添加的约束 - 在代码里给
viewB设置正确的autoresizingMask,而不是viewA:
@IBAction func buttonAction(_ sender: Any) { viewA.autoresizesSubviews = true // 给子视图viewB设置拉伸规则,让它跟随父视图的宽高变化 viewB.autoresizingMask = [.flexibleWidth, .flexibleHeight] viewA.bounds = CGRect(x: 0, y: 0, width: 100, height: 100) }
方案3:代码动态更新约束(如果需要灵活调整)
要是你想保留现有约束但动态调整,比如让viewB的尺寸是viewA的某个比例,那可以在代码里修改约束的constant或者优先级,但前提是这些约束必须是绑定到viewA上的。
小提示
- 当你在Storyboard里用Auto Layout时,
translatesAutoresizingMaskIntoConstraints默认是false,这时候autoresizingMask完全不生效,所有布局都由约束说了算 - 修改父视图尺寸后,系统会自动触发子视图的布局更新,一般不需要手动调用
layoutIfNeeded(),除非你要加动画效果
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

