这听起来并不难,但经过几个小时的努力,我还是找不到合适的解决办法。
问题:我希望设置约束(使用类NSLayoutAnchor),以获得在superview中以为中心的的子视图(colorImageView),在有时具有宽度>高度或高度>宽度>宽度的超级视图中,纵横比为1:1,并且始终处于最大尺寸。
示例1:SuperViewSize =宽度: 80,高度= 100 ->子视图的高度和宽度应为80,并以(40/50)为中心
示例2:SuperviewSize =宽度: 60,高度= 50 ->子视图的高度和宽度应为50,并以(30/25)为中心
我不想/and --它不能解决这个问题/硬编码一个widthConstraint = min(superviewWidth,superviewHeight),因为在创建子视图时,超级视图的界限没有最终定义为->,所以我需要一个约束。
到目前为止,这是我的尝试(仍然缺少在可变的superview中将高度和宽度设置在最大可能范围内的约束:
// CREATE CONSTRAINTS(center in SuperView)
colorImageView.centerXAnchor.constraint(equalTo: self.centerXAnchor).isActive = true
colorImageView.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
// CREATE CONSTRAINTS (ratio 1:1)
colorImageView.widthAnchor.constraint(equalTo: colorImageView.heightAnchor, multiplier: 1.0).isActive = true,我真的很感激你给我一个提示,怎么做。(预先谢谢:)
发布于 2016-11-07 03:57:09
使此工作的关键是将colorImageView的宽度设置为其superview的宽度,但优先级为750 (而不是默认的1000)。
然后将colorImageView的高度设置为lessThanOrEqualTo,即其超级视图的高度。
汽车布局将尽最大努力满足这两个新的约束。
当视图的宽度大于其高度时,它将无法使colorImageView的宽度与视图的宽度相等,但这是可以的,因为优先级是750。它将使它尽可能大,而不违反其他充分的优先限制。
当视图的高度大于其宽度时,它将能够满足所有约束,因为颜色视图的高度是视图的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()在这里它运行在一个游乐场:

https://stackoverflow.com/questions/40455046
复制相似问题