Проблема с макетом (NSLayoutConstraint) в приложении для iOS - PullRequest
0 голосов
/ 03 июля 2019

В приложении для iOS возникла проблема с автоматическим размещением.

На следующих 2 снимках экрана показана проблема.

enter image description here

enter image description here

Переключатель (объект UISwitch) справа смещен горизонтально, когда он должен быть зафиксирован.Кто-нибудь может увидеть, что происходит?

Это правда, что строка слева меняет длину, но я думаю (в соответствии с тем, как я установил ограничения) шрифт должен быть изменен или разделить строкув 2 строки;но не смещенный переключатель.

Вот соответствующий код swift:

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."}
    }
}

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Вы не предоставили достаточно информации для воспроизведения проблемы.Вот сокращение вашего кода, в моем контроллере вида viewDidLoad (я удалил все, кроме метки и переключателя, исправил ваши left и right (вы никогда не должны их использовать) и изменил выравнивание между двумя представлениямиtop вместо center):

    khToggle = UISwitch()
    khToggle.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(khToggle)

    khLabel = UILabel()
    khLabel.text = String(repeating: "word ", count: 40)
    khLabel.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(khLabel)


    // Do any additional setup after loading the view.
    khLabel.numberOfLines = 0

    view.addConstraints([
        NSLayoutConstraint(item: khToggle!, attribute: .trailing, relatedBy: .equal,
                               toItem: view, attribute: .trailing, multiplier: 1.0,    constant: -30.0),
        NSLayoutConstraint(item: khToggle!, attribute: .top, relatedBy: .equal,
                           toItem: view, attribute: .top, multiplier: 1.0,
                           constant: 50.0),
        NSLayoutConstraint(item: khLabel!, attribute: .trailing, relatedBy: .equal,
                           toItem: khToggle, attribute: .leading, multiplier: 1.0,     constant: -23.0),
        NSLayoutConstraint(item: khLabel!, attribute: .top, relatedBy: .equal,
                           toItem: khToggle, attribute: .top, multiplier: 1.0,  constant: 0.0),
        NSLayoutConstraint(item: khLabel!, attribute: .leading, relatedBy: .equal,
                           toItem: view, attribute: .leading, multiplier: 1.0,     constant: 30.0)])

Результат отображается нормально;нет никаких конфликтов ограничений или неясностей, и это выглядит так, как и следовало ожидать:

enter image description here

0 голосов
/ 03 июля 2019

Горизонтальные ограничения для метки и переключателя конкурируют друг с другом.

(Если вы войдете в визуальный отладчик Xcode, вы обнаружите предупреждение: экземпляр UISwitch имеет неоднозначную ширину и горизонтальное положение.)

enter image description here

Решение

Вы указали абсолютные значения для AutoLayout, и он не может удовлетворить требования. Чтобы исправить это, внесите некоторую гибкость в требования, установив сопротивление сжатия этикетки на более низкое значение:

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...