如何以百分比相对定位UIView?Auto Layout比例约束疑问
解决AutoLayout中用百分比定位视图中心的问题
嘿,这个问题我太懂了!确实,centerYAnchor的那些便捷约束方法没有暴露multiplier参数,手动计算constant又太麻烦——尤其是父视图尺寸动态变化的时候,每次都要重新计算简直是噩梦。不过咱们有几个优雅的办法可以搞定:
方法1:iOS 10+ 推荐用等式约束(最直观)
从iOS 10开始,AutoLayout支持直接用等式语法创建复杂约束,完美匹配你要的“按钮中心在父视图高度25%处”的需求:
// 第一步:务必关闭按钮的自动 autoresizing mask 转换 button.translatesAutoresizingMaskIntoConstraints = false // 创建约束:按钮的centerY = 父视图顶部 + 父视图高度 * 0.25 let centerYConstraint = NSLayoutConstraint( equation: button.centerYAnchor == superview.topAnchor + superview.heightAnchor * 0.25 ) // 激活约束 centerYConstraint.isActive = true
这个写法完全符合你的逻辑,不用绕弯子,一眼就能看明白约束的含义。
方法2:兼容iOS 9及以下(双约束组合)
如果需要支持更低版本的系统,可以通过两个约束的组合来实现同样的效果:
button.translatesAutoresizingMaskIntoConstraints = false // 约束1:按钮centerY和父视图顶部对齐(基础定位) let topAnchorConstraint = NSLayoutConstraint( item: button, attribute: .centerY, relatedBy: .equal, toItem: superview, attribute: .top, multiplier: 1.0, constant: 0.0 ) // 约束2:按钮centerY等于父视图高度的25%(比例控制) let heightMultiplierConstraint = NSLayoutConstraint( item: button, attribute: .centerY, relatedBy: .equal, toItem: superview, attribute: .height, multiplier: 0.25, constant: 0.0 ) // 同时激活两个约束,AutoLayout会自动计算出正确的位置 NSLayoutConstraint.activate([topAnchorConstraint, heightMultiplierConstraint])
原理是把“top + 25% height”拆成两个约束的组合,让AutoLayout帮你完成加法运算,同样不用手动计算constant。
额外提醒
不管用哪种方法,都要确保你的按钮和父视图都设置了translatesAutoresizingMaskIntoConstraints = false——这是使用AutoLayout的基础,否则约束会和系统自动生成的布局规则冲突,导致布局异常。
内容的提问来源于stack exchange,提问作者Alex Bollbach
相关产品推荐
相关产品推荐

