需要有关自动布局锚点的帮助

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了需要有关自动布局锚点的帮助相关的知识,希望对你有一定的参考价值。

我正在学习自动布局锚点并试图以编程方式实现这个简单的事情

enter image description here

在这里我的代码

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    let view1 = UIView()
    view1.backgroundColor = .brown
    blueView.addSubview(view1)

    view1.translatesAutoresizingMaskIntoConstraints = false
    view1.topAnchor.constraint(equalTo: blueView.topAnchor, constant:10).isActive = true
    view1.bottomAnchor.constraint(equalTo: blueView.bottomAnchor, constant:10).isActive = true
    view1.leadingAnchor.constraint(equalTo: blueView.leadingAnchor, constant:10).isActive = true
    view1.trailingAnchor.constraint(equalTo: blueView.trailingAnchor, constant:10).isActive = true
    view1.heightAnchor.constraint(equalToConstant: 80).isActive = true
    view1.widthAnchor.constraint(equalToConstant: 80).isActive = true
}

这就是我得到的

enter image description here

出了什么问题?

答案

出了什么问题?

我看到三类问题:

  1. 一些约束不活跃。没有设置heightAnchorwidthAnchor约束,以便isActive = true
  2. 约束是冲突的。您正在基于常量设置约束,而不考虑超视图的尺寸。这导致了冲突的限制,例如,view1不能高出100点,超级视图顶部263点,底部锚点284点,同时也是如此。
  3. 基于常量的约束通常无法将视图置于屏幕中心,因为屏幕尺寸变化很大。

以下是这三个问题的一种可能解决方案:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)

    let view1 = UIView()
    view1.backgroundColor = .brown
    view.addSubview(view1)

    view1.translatesAutoresizingMaskIntoConstraints = false
    view1.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    view1.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    view1.heightAnchor.constraint(equalToConstant: 100.0).isActive = true
    view1.widthAnchor.constraint(equalToConstant: 100.0).isActive = true
}

在这里,我们将view1的X和Y中心设置为等于超视图的X和Y中心,将view1的高度和宽度定义为常量,并将所有相关约束设置为活动的。

您可以在Auto Layout Guide找到其他解决方案。

另一答案

尝试这样做:

override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(true)

let view1 = UIView()
view1.backgroundColor = .brown
view.addSubview(view1)

view1.translatesAutoresizingMaskIntoConstraints = false

//Constraints
let centerXConstraint = view1.centerXAnchor.constraint(equalTo: self.view.centerXAnchor, constant: 0)
let centerYConstraint = view1.centerYAnchor.constraint(equalTo: self.view.centerYAnchor, constant: 0)
let widthConstraint = view1.widthAnchor.constraint(equalToConstant: 100)
let heightConstraint = view1.heightAnchor.constraint(equalToConstant: 100)

//Apply constraints
constraintToApply.append(centerXConstraint)
constraintToApply.append(centerYConstraint)
constraintToApply.append(widthConstraint)
constraintToApply.append(heightConstraint) 
}

并添加以下代码:

override func viewDidAppear(_ animated: Bool) {

    // Apply Constraints
    NSLayoutConstraint.activate(constraintToApply)
    self.view.layoutIfNeeded()
}

希望这可以帮到你。

另一答案

您为每个约束添加+10个点。

view1.topAnchor.constraint(equalTo: blueView.topAnchor, constant:10).isActive = true

这意味着“将view1的顶部锚点设置为blueView加10的顶部锚点”

只需删除constant:10

view1.topAnchor.constraint(equalTo: blueView.topAnchor).isActive = true

如果您设置顶部,底部,左侧,前导和尾随锚点,则不应设置高度和宽度。宽度和高度将根据这4个锚点计算。所以,你应该删除

view1.heightAnchor.constraint(equalToConstant: 80).isActive = true
view1.widthAnchor.constraint(equalToConstant: 80).isActive = true

以上是关于需要有关自动布局锚点的帮助的主要内容,如果未能解决你的问题,请参考以下文章

需要有关以编程方式创建自动布局约束的帮助

HTML中所有锚点的一般偏移量?

Unity——RectTransform详解

jQuery load() 帮助

第五十七天 盒模型布局

使用自动布局时,如何调整 CALayer 的锚点?