我试图以编程方式使用自动布局,以使我的自定义视图在边界更改时适应其大小。
我想要达到的目标:
1)在屏幕上使视图尽可能大,但将其高度和尺寸的长宽比保持在8/5
2)永远不要离开安全区域
3)永远留在中间
当我在情节提要中使用这组约束时,一切工作都很好,但是当我在代码中执行相同的操作时,xcode破坏了我的高度约束(我将其用于视图的纵横比)。我打的很优先,但是没有成功。我究竟做错了什么?
这是我的代码和情节提要约束的屏幕截图:
screenshot of storyboard constraints
private func setupLayout () {
playingCardView.translatesAutoresizingMaskIntoConstraints = false
//makes the maxim width possible
let playingCardViewWidthConstraint = playingCardView.widthAnchor.constraint(equalToConstant: 800)
playingCardViewWidthConstraint.priority = UILayoutPriority(rawValue: 250)
playingCardViewWidthConstraint.identifier = "width"
//for aspect ratio
let playingCardViewHeightConstraint = playingCardView.heightAnchor.constraint(equalTo: playingCardView.widthAnchor, multiplier: 8.0/5.0)
playingCardViewHeightConstraint.identifier = "height"
//make the view stay within bounds
//add some padding top
let playingCardTopConstraint = playingCardView.topAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.topAnchor, constant: Constants.offsetFromTheEdge)
//add some padding bottom
let plaingCardViewBottomConstraint = playingCardView.bottomAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.bottomAnchor, constant: Constants.offsetFromTheEdge)
//add some padding leading
let playingCardViewLeadingConstraint = playingCardView.leadingAnchor.constraint(lessThanOrEqualTo: view.layoutMarginsGuide.leadingAnchor, constant: Constants.offsetFromTheEdge)
////add some padding trailing
let playingCardViewTrailingConstraint = playingCardView.trailingAnchor.constraint(lessThanOrEqualTo: view.layoutMarginsGuide.trailingAnchor, constant: Constants.offsetFromTheEdge)
NSLayoutConstraint.activate([
playingCardViewWidthConstraint,
playingCardViewHeightConstraint,
playingCardView.centerXAnchor.constraint(equalTo: view.centerXAnchor),
playingCardView.centerYAnchor.constraint(equalTo: view.centerYAnchor),
playingCardTopConstraint,
playingCardViewBottomConstraint,
playingCardViewLeadingConstraint,
playingCardViewTrailingConstraint
])
}
}
答案 0 :(得分:0)
关于约束,您需要考虑四件事
x =>前导/尾随/左/右/居中X
y => top,bottom,centerY
width =>静态/比例
高度=>静态/比例
我认为在这里您会触发所有可能的冲突,而不考虑优先级
您将视图的宽度设置为800,并使其前导&&尾随肯定小于该宽度,如何操作
您给出视图纵横比的高度并将其挂在顶部和底部,如何操作?
您给出前导和尾随并给出centerX,为什么?
您给出顶部和底部,并给出centerY,为什么?
如果不添加任何值,则不添加约束
答案 1 :(得分:0)
在您发布的代码中...
您在y
中缺少let plaingCardViewBottomConstraint = ...
除此之外,您将顶部和底部约束设置为view.safeAreaLayoutGuide
,但是将前导和尾随约束设置为layoutMarginsGuide
。
将view.layoutMarginsGuide
更改为view.safeAreaLayoutGuide
,您应该会得到期望的结果。