以编程方式进行的约束与情节提要中的约束的工作方式不同

时间:2018-10-20 16:30:43

标签: ios swift autolayout constraints programmatically

我试图以编程方式使用自动布局,以使我的自定义视图在边界更改时适应其大小。 我想要达到的目标:
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
            ])
    }
}

2 个答案:

答案 0 :(得分:0)

关于约束,您需要考虑四件事

x =>前导/尾随/左/右/居中X

y => top,bottom,centerY

width =>静态/比例

高度=>静态/比例

我认为在这里您会触发所有可能的冲突,而不考虑优先级

  

您将视图的宽度设置为800,并使其前导&&尾随肯定小于该宽度,如何操作

     

您给出视图纵横比的高度并将其挂在顶部和底部,如何操作?

     

您给出前导和尾随并给出centerX,为什么?

     

您给出顶部和底部,并给出centerY,为什么?

如果不添加任何值,则不添加约束

答案 1 :(得分:0)

在您发布的代码中...

您在y中缺少let plaingCardViewBottomConstraint = ...

除此之外,您将顶部和底部约束设置为view.safeAreaLayoutGuide,但是将前导和尾随约束设置为layoutMarginsGuide

view.layoutMarginsGuide更改为view.safeAreaLayoutGuide,您应该会得到期望的结果。