Ограничение Swift Trailing не работает должным образом в табличном представлении

Я имею UITableView расширение, определенное функцией для размещения представления по умолчанию поверх tableView. По какой-то причине следующие строки кода не работают должным образом.

1) Кодекс, который не дал правильного решения

func addNoDataView() -> UIView {
        let containerView = UIView(forAutoLayout: ())
        self.addSubview(containerView)
        containerView.backgroundColor = UIColor.black
        containerView.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
        containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
        containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
        containerView.autoSetDimension(.height, toSize: 150)
        return containerView
}

В этом случае ожидаемым результатом будет черный вид с 40 пикселями сверху tableView с начальным и конечным полями. Но когда я бежал, я даже не мог определить вид.

2) Кодекс, который предоставил правильное решение

func addNoDataView() -> UIView {
            let containerView = UIView(forAutoLayout: ())
            containerView.backgroundColor = UIColor.black
            self.addSubview(containerView)
            containerView.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
            containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8)
            containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)
            containerView.autoSetDimension(.height, toSize: 150)
            return containerView
    }

В этом случае я получил ожидаемое решение. т.е. черный вид 40 сверху и с 8 в качестве полей от задней и передней кромок от tableView с 150 в качестве высоты.

У меня есть еще одна функция, которая почти совпадает с описанной выше, но с меньшей разницей (я думаю).

func addNoDataLabelToTableView() -> UILabel {
        let label = UILabel(forAutoLayout: ())
        self.addSubview(label)
        label.textColor = UIColor.darkGray
        label.textAlignment = .center
        label.text = "No Data Available"
        label.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8)
        label.autoPinEdge(.leading, to: .leading, of: self, withOffset: 8)
        label.autoSetDimension(.height, toSize: 20)
        label.autoCenterInSuperview()
        return label
    }

Эта функция добавляет метку в центр tableView и работает отлично, как и ожидалось.

tableView прикреплен к своим краям суперпредставления со всех 4 сторон. Никаких проблем с этим.

Тем не менее, я не могу понять, почему дело 1 не работает. Может кто-нибудь объяснить, пожалуйста, разницу между этими двумя линиями?

1) containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: 8) который не работал

2) containerView.autoPinEdge(.trailing, to: .trailing, of: self, withOffset: self.frame.width - 8) который работал на удивление.

1 ответ

Решение

Вы добавляете .containerView к UITableView... который наследует от UIScrollView,

Представления прокрутки имеют немного другую связь с ограничениями, так как они также определяют .contentSize для просмотра прокрутки.

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

Итак, вы захотите изменить свой addNoDataView() Функциональность для:

func addNoDataView() -> UIView {
    let containerView = UIView(forAutoLayout: ())

    self.addSubview(containerView)
    containerView.backgroundColor = UIColor.black

    // inset view 8-pts from left
    containerView.autoPinEdge(.left, to: .left, of: self, withOffset: 8)

    // inset view 40-pts from top
    containerView.autoPinEdge(.top, to: .top, of: self, withOffset: 40)

    // set width to width of self (a scrollview) -16 (inset 8 from left and 8 from right)
    containerView.autoMatch(.width, to: .width, of: self, withOffset: -16.0)

    // set explicit height to 150
    containerView.autoSetDimension(.height, toSize: 150)

    return containerView
}
Другие вопросы по тегам