NSLayoutContraints применены непоследовательно (по-видимому) на UITableViewController - PullRequest
0 голосов
/ 02 мая 2018

Я пытаюсь добавить какое-то оверлейное меню на UITableViewController. Моя первая цель - сделать так, чтобы фоновое изображение отображалось внизу экрана на очень бесплодном контроллере. Я делаю это программно, используя следующий код в обратном вызове для кнопки панели, то есть вызывается после того, как произошла оригинальная раскладка:

    print("self.tableView.frame=\(self.tableView.frame)")
    let settingsView = UIView()
    settingsView.translatesAutoresizingMaskIntoConstraints = false
    settingsView.backgroundColor = UIColor.cyan.withAlphaComponent(0.5)
    self.view.addSubview(settingsView)
    self.view.addConstraints([
        NSLayoutConstraint(item: settingsView, attribute: .bottom, relatedBy: .equal, toItem: self.tableView, attribute: .bottom, multiplier: 1, constant: 50),
        NSLayoutConstraint(item: settingsView, attribute: .leading, relatedBy: .equal, toItem: self.tableView, attribute: .leading, multiplier: 1, constant: 0),
        NSLayoutConstraint(item: settingsView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: self.view.frame.width),
        //NSLayoutConstraint(item: settingsView, attribute: .trailing, relatedBy: .equal, toItem: self.tableView, attribute: .trailing, multiplier: 1, constant: 0),
        NSLayoutConstraint(item: settingsView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 100)
        ])
    self.view.setNeedsLayout()

Но результат не выглядит так, как я ожидал: вместо того, чтобы быть в нижней части экрана, нижняя часть моего представления фактически выровнена с верхним полем (отсюда и значение 50, чтобы увидеть, как оно проходит, вы Вы можете увидеть голубой цвет через панель навигации на картинке прилагается). Это почему? Если я изменю первое ограничение, чтобы выровнять вершины вместо оснований, это работает хорошо (но наверху конечно).

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

Команда print в начале гарантирует, что tableView имеет правильный размер:

self.tableView.frame=(0.0, 0.0, 375.0, 667.0)

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

screenshot

1 Ответ

0 голосов
/ 03 мая 2018

Таким образом, проблема здесь действительно заключается в UITableView(Controller), так как эти ограничения работают нормально с нормальным UIView(Controller). UINavigationController вокруг него здесь не играет роли. По какой-то причине кажется, что якоря .bottom и .trailing нельзя использовать в табличном представлении - если кто-то знает почему или может объяснить мне, как это сделать, сделайте это!

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

NSLayoutConstraint(item: settingsView, 
    attribute: .bottom, 
    relatedBy: .equal, 
    toItem: self.view, 
    attribute: .top, 
    multiplier: 1, 
    constant: self.view.frame.height + self.view.bounds.minY)

Это приводит к хорошему представлению в нижней части экрана. self.view.bounds.minY в константе учитывает наличие навигационной панели в верхней части экрана. Все еще ощущается как «взлом» для меня, особенно потому, что я не понимаю, почему другая версия не работает.

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