如何设置NSLayoutAnchor以生成纵横比为1:1的居中子视图

时间:2016-11-06 22:04:05

标签: autolayout nslayoutanchor

这听起来并不太难,但经过几个小时的尝试后,我无法找到合适的解决方案。

问题:我想设置约束(使用类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

我真的很感激提示,如何做到这一点。提前致谢:))

1 个答案:

答案 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中运行:

enter image description here