温馨提示:本文翻译自stackoverflow.com,查看原文请点击:swift - A layout issue (NSLayoutConstraint) in an iOS app
autolayout nslayoutconstraint swift

swift - iOS应用中的布局问题(NSLayoutConstraint)

发布于 2020-03-27 10:41:41

在iOS应用中,我遇到了自动布局问题。

以下2个屏幕截图显示了该问题。

在此处输入图片说明

在此处输入图片说明

右侧的开关(UISwitch对象)应固定在水平位置。谁能看到发生了什么事?

的确,左边的字符串正在改变长度,但是我认为(根据我设置约束的方式)应重新设置字体大小或将字符串分成两行;但开关不会移位。

这是相关的快速代码:

import UIKit

class My_ViewController: UIViewController {
    let xPanel = UILabel(), yPanel = UILabel(),
    khToggle = UISwitch(), khLabel = UILabel()
    ....

    override func viewDidLoad() {
        super.viewDidLoad()
        layOutUI()
    }


    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        .....
        toggleKeepHide(khToggle)
    }


    func layOutUI() {
        for component in [xPanel,yPanel,khLabel,khToggle] {
            component.translatesAutoresizingMaskIntoConstraints = false
            view.addSubview(component)
        }

        ...........

        khLabel.numberOfLines = 0
        khLabel.adjustsFontSizeToFitWidth = true
        khToggle.addTarget(self,
                                 action: #selector(toggleKeepHide(_:)),
                                 for: .valueChanged)

        view.addConstraints([
            .........
            NSLayoutConstraint(item: khToggle, attribute: .right, relatedBy: .equal,
                               toItem: view, attribute: .right, multiplier: 1.0,    constant: -30.0),
            NSLayoutConstraint(item: khToggle, attribute: .top, relatedBy: .equal,
                               toItem: yPanel, attribute: .bottom, multiplier: 1.0,
                               constant: 50.0),
            NSLayoutConstraint(item: khLabel, attribute: .right, relatedBy: .equal,
                               toItem: khToggle, attribute: .left, multiplier: 1.0,     constant: -23.0),
            NSLayoutConstraint(item: khLabel, attribute: .centerY, relatedBy: .equal,
                               toItem: khToggle, attribute: .centerY, multiplier: 1.0,  constant: 0.0),
            NSLayoutConstraint(item: khLabel, attribute: .left, relatedBy: .equal,
                               toItem: view, attribute: .left, multiplier: 1.0,     constant: 30.0)])
    }


    @objc func toggleKeepHide(_ sender: UISwitch) {
        if sender.isOn {khLabel.text = "Hide this object from the wyxoug list."}
        else {khLabel.text = "Keep this object in the wyxoug list."}
    }
}

查看更多

查看更多

提问者
Michel
被浏览
275
Womble 2019-07-03 20:06

标签和切换的水平约束相互竞争。

(如果您进入Xcode的可视调试器,则会发现一个警告:该UISwitch实例的宽度和水平位置不明确。)

在此处输入图片说明

您已经为AutoLayout提供了绝对值,但它无法解决要求。要解决此问题,可以通过将标签的抗压强度设置为较低的值来为要求提供一些灵活性:

khLabel.setCompressionResistance(.defaultLow, for: .horizontal)

在此处输入图片说明