首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置NSLayoutAnchor以生成高宽比为1:1的中心子视图

如何设置NSLayoutAnchor以生成高宽比为1:1的中心子视图
EN

Stack Overflow用户
提问于 2016-11-06 22:04:05
回答 1查看 3.8K关注 0票数 1

这听起来并不难,但经过几个小时的努力,我还是找不到合适的解决办法。

问题:我希望设置约束(使用类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中将高度和宽度设置在最大可能范围内的约束:

代码语言:javascript
复制
// 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

,我真的很感激你给我一个提示,怎么做。(预先谢谢:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-07 03:57:09

使此工作的关键是将colorImageView的宽度设置为其superview的宽度,但优先级为750 (而不是默认的1000)。

然后将colorImageView的高度设置为lessThanOrEqualTo,即其超级视图的高度。

汽车布局将尽最大努力满足这两个新的约束。

当视图的宽度大于其高度时,它将无法使colorImageView的宽度与视图的宽度相等,但这是可以的,因为优先级是750。它将使它尽可能大,而不违反其他充分的优先限制。

当视图的高度大于其宽度时,它将能够满足所有约束,因为颜色视图的高度是视图的lessThanOrEqualTo高度。

代码语言:javascript
复制
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()

在这里它运行在一个游乐场:

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40455046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档