Центрировать элементы стека и не заполнять их - PullRequest
0 голосов
/ 22 марта 2019

Я использую UIStackView в качестве свойства UITableView's BackGroundView, поэтому при возникновении ошибки при получении коллекции, которая заполняет tableView, я могу вызвать функцию, которая отображает это представление стека, содержащее представления, которые показывают предупреждающее сообщение иПовторите попытку.

Я проверил аналогичное поведение в пустом UIViewController, чтобы можно было центрировать stackView и его дочерние элементы.Решение сработало, когда я прикрепил представление стека к конечному и ведущему элементам superView, отцентрировал его по вертикали и установил его верхнюю привязку, чтобы она была больше или равна верхней привязке superView, и аналогично его нижняя привязка больше или равна нижней привязке superView.Я также установил выравнивание по центру и распределение, чтобы заполнить, и все, казалось, работало должным образом.

Вот несколько скриншотов: enter image description here

enter image description here

enter image description here

Я использовал этот код в расширении UITableView, но мог только воспроизвести это поведение.Есть ли ошибки в этом коде?

func show(error: Bool, withMessage message : String? = nil, andRetryAction retry: (() -> Void)? = nil){
    if error{
        let iconLabel = UILabel()
        iconLabel.GMDIcon = .gmdErrorOutline
        iconLabel.textAlignment = .center
        iconLabel.numberOfLines = 0
        iconLabel.font = iconLabel.font.withSize(50)
        iconLabel.textColor = Constants.Colors.ErrorColor

        iconLabel.backgroundColor = .blue

        let messageLabel = UILabel()
        messageLabel.text = message ?? "Ocorreu um erro"
        messageLabel.textColor = Constants.Colors.ErrorColor
        messageLabel.numberOfLines = 0
        messageLabel.textAlignment = .center
        messageLabel.font = UIFont(name: "TrebuchetMS", size: 20)

        messageLabel.backgroundColor = .green

        var views: [UIView] = [iconLabel, messageLabel]

        if let retry = retry{
            let button = RaisedButton(title: "Tentar novamente")
            button.pulseColor = Constants.Colors.PrimaryTextColor
            button.backgroundColor = Constants.Colors.PrimaryColor
            button.titleColor = .white
            button.actionHandle(controlEvents: .touchUpInside, ForAction: retry)
            button.contentEdgeInsets = UIEdgeInsetsMake(10,10,10,10)


            views.append(button)
        }


    }else{
        self.backgroundView = nil
    }
}
let stack = UIStackView()
    stack.spacing = 10
    stack.axis = .vertical
    stack.alignment = .center
    stack.distribution = .fill
    stack.translatesAutoresizingMaskIntoConstraints = false


    for view in views{
        view.translatesAutoresizingMaskIntoConstraints = false
        stack.addArrangedSubview(view)
    }

    if self.tableFooterView == nil{
        tableFooterView = UIView()
    }
    self.backgroundView = stack;

    if #available(iOS 11, *) {
        let guide = self.safeAreaLayoutGuide

        stack.topAnchor.constraint(greaterThanOrEqualTo: guide.topAnchor).isActive = true
        stack.bottomAnchor.constraint(greaterThanOrEqualTo: guide.bottomAnchor).isActive = true
        stack.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
        stack.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
        stack.centerYAnchor.constraint(equalTo: guide.centerYAnchor).isActive = true
    } else {
        stack.topAnchor.constraint(greaterThanOrEqualTo: self.topAnchor).isActive = true
        stack.bottomAnchor.constraint(greaterThanOrEqualTo: self.bottomAnchor).isActive = true
        stack.leadingAnchor.constraint(equalTo: self.leadingAnchor).isActive = true
        stack.trailingAnchor.constraint(equalTo: self.trailingAnchor).isActive = true
        stack.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
    }

enter image description here

1 Ответ

1 голос
/ 22 марта 2019

Представление стека знает свою высоту, если все его элементы имеют внутренний размер (то есть сумму их индивидуальных высот + расстояние между элементами).В этом случае, поскольку у вас есть ограничения на 2 года, вы подразумеваете высоту, поэтому ваши ограничения неудовлетворительны.Единственное ограничение оси Y, в котором вы нуждаетесь, - это центр по вертикали.избавиться от верхних и нижних ограничений.Затем система будет использовать собственный размер, чтобы вычислить высоту стекового вида и центрировать его вертикально в фоновом режиме.Оставьте ограничения по оси X как есть.

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