这听起来并不太难,但经过几个小时的尝试后,我无法找到合适的解决方案。
问题:我想设置约束(使用类NSLayoutAnchor)以在superview中获得子视图(colorImageView),以为中心,宽高比为1:1 并且在超级视图中始终处于最大尺寸,有时宽度大于&gt; <高度或高度>宽度。
示例1 :SuperViewSize = width:80,height = 100 - &gt;子视图的高度和宽度应为80,并以(40/50)
为中心示例2 :SuperviewSize = width:60,height = 50 - &gt;子视图的高度和宽度应为50,并以(30/25)
为中心我不想/并且它没有解决问题/硬编码widthConstraint = min(superviewWidth,superviewHeight)因为在创建子视图时,超视图边界最终没有定义 - &gt;所以我需要一个约束。
这是我到目前为止的尝试(仍然缺少在变化的超视图中最大可能设置高度和宽度的约束:
BP
我真的很感激提示,如何做到这一点。提前致谢:))
答案 0 :(得分:6)
使这项工作的关键是将colorImageView
的宽度设置为等于其超级视图的宽度,但优先级为750(而不是默认的1000)。
然后将colorImageView
的高度设置为lessThanOrEqualTo
其超级视图的高度。
自动布局将尽力满足这两个新约束条件。
当视图的宽度大于其高度时,它将无法使colorImageView
的宽度等于视图的宽度,但这是正常的,因为优先级是750.它会使它变大尽可能不违反其他全部优先权限制。
当视图的高度大于其宽度时,它将能够满足所有约束,因为colorView的高度为lessThanOrEqualTo
视图的高度。
import UIKit
let view = UIView(frame: CGRect(x: 0, y: 0, width: 80, height: 100))
view.backgroundColor = .red
let colorImageView = UIView()
colorImageView.translatesAutoresizingMaskIntoConstraints = false
colorImageView.backgroundColor = .yellow
view.addSubview(colorImageView)
// CREATE CONSTRAINTS(center in SuperView)
colorImageView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
colorImageView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
// CREATE CONSTRAINTS (ratio 1:1)
colorImageView.widthAnchor.constraint(equalTo: colorImageView.heightAnchor, multiplier: 1.0).isActive = true
let widthConstraint = colorImageView.widthAnchor.constraint(equalTo: view.widthAnchor)
widthConstraint.priority = UILayoutPriority(rawValue: 750)
widthConstraint.isActive = true
colorImageView.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor).isActive = true
view.layoutIfNeeded()
view.frame = CGRect(x: 0, y: 0, width: 60, height: 50)
view.layoutIfNeeded()
此处它正在Playground中运行: