Runtime调整UIView尺寸失败求助:Storyboard居中视图改100×100
解决Storyboard视图Runtime修改尺寸无效的问题
嘿,这个坑我之前踩过!你遇到的问题核心原因是Auto Layout约束在运行时会覆盖你直接修改的frame值——因为你在Storyboard里给这个UIView设置了垂直水平居中、固定宽300高100的约束,这些约束会在Runtime自动计算并重置视图的frame,所以你直接改frame的操作会被约束“打回原形”。
先说说你之前尝试的代码为什么没用:
sampleView.draw(cgRect):这个方法是用来在视图内部绘制自定义内容的,完全不是用来修改视图本身尺寸的,所以根本不会生效。- 直接修改
frame.size.width/height:因为frame是结构体类型,Swift不允许直接修改结构体的属性,你必须重新赋值整个frame对象才行。但就算你重新赋值了sampleView.frame = CGRect(...),Auto Layout的约束还是会在后续的布局更新中把尺寸改回300×100。
下面给你两种靠谱的解决方案:
方案1:修改约束的Constant值(推荐)
这是最符合Auto Layout设计思路的做法,既能保留原来的居中约束,又能修改尺寸:
- 打开Storyboard,选中你的
sampleView,找到它的宽度约束和高度约束(就是你设置的300和100那两个)。 - 把这两个约束分别拖到对应的ViewController代码里,创建IBOutlet:
@IBOutlet weak var sampleViewWidthConstraint: NSLayoutConstraint! @IBOutlet weak var sampleViewHeightConstraint: NSLayoutConstraint! - 在Runtime需要修改尺寸的地方,修改约束的
constant值并触发布局更新:// 修改宽高为100×100 sampleViewWidthConstraint.constant = 100 sampleViewHeightConstraint.constant = 100 // 立即触发布局更新,让修改生效 sampleView.layoutIfNeeded()
方案2:关闭Auto Layout,改用Frame控制
如果你完全不想用约束了,想手动控制frame,可以开启视图的translatesAutoresizingMaskIntoConstraints属性,这样Auto Layout就不会干涉它的布局了:
// 告诉系统不要用Auto Layout约束来控制这个视图 sampleView.translatesAutoresizingMaskIntoConstraints = true // 修改尺寸,同时保留原来的居中位置(直接改bounds只改尺寸,不改变位置) sampleView.bounds.size = CGSize(width: 100, height: 100) // 或者重新设置整个frame(注意要计算好居中的x和y坐标,不然视图会偏移) // let center = sampleView.center // sampleView.frame = CGRect(x: center.x - 50, y: center.y - 50, width: 100, height: 100)
推荐优先用方案1,这样视图的居中属性会被约束自动维护,不用自己计算位置,更省心。
内容的提问来源于stack exchange,提问作者jay123456
相关产品推荐
相关产品推荐

