UITableViewFooter проблема с высотой - PullRequest
0 голосов
/ 28 марта 2019

В моем приложении у меня есть UITableView с заголовком, созданным с помощью .xib, это класс:

class ViewHomeHeader: UIView {
    class func instanceFromNib() -> ViewHomeHeader {
        return UINib(nibName: "ViewHomeHeader", bundle: nil).instantiate(withOwner: self, options: nil).first as! ViewHomeHeader
    }
}

Я добавляю его в tableHeaderView:

let viewHomeHeader = ViewHomeHeader.instanceFromNib()
tableView.tableHeaderView = viewHomeHeader

Это .xib только с одной меткой и ее относительными ограничениями. enter image description here

Это результат, если я запускаю на симуляторе (то же самое на устройстве)

enter image description here

Я не могу понять, почему высота больше 21. С «иерархией представления отладки» я вижу, что используется не высота метки, а UIView-Encapsulated-Layout-Height

Журнал консоли:

    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x28079f9d0 UILabel:0x104529b80'Label'.height == 21   (active)>",
    "<NSLayoutConstraint:0x2807ac0a0 UILayoutGuide:0x281d9d500'UIViewSafeAreaLayoutGuide'.bottom == UILabel:0x104529b80'Label'.bottom + 17   (active)>",
    "<NSLayoutConstraint:0x2807ac140 UILabel:0x104529b80'Label'.top == UILayoutGuide:0x281d9d500'UIViewSafeAreaLayoutGuide'.top + 18   (active)>",
    "<NSLayoutConstraint:0x2807ae490 'UIView-Encapsulated-Layout-Height' Jordy.ViewHomeHeader:0x104529790.height == 143   (active)>",
    "<NSLayoutConstraint:0x2807ac000 'UIViewSafeAreaLayoutGuide-bottom' V:[UILayoutGuide:0x281d9d500'UIViewSafeAreaLayoutGuide']-(0)-|   (active, names: '|':Jordy.ViewHomeHeader:0x104529790 )>",
    "<NSLayoutConstraint:0x28079fc50 'UIViewSafeAreaLayoutGuide-top' V:|-(0)-[UILayoutGuide:0x281d9d500'UIViewSafeAreaLayoutGuide']   (active, names: '|':Jordy.ViewHomeHeader:0x104529790 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x28079f9d0 UILabel:0x104529b80'Label'.height == 21   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Как указано в документации:

При назначении вида этому свойству установите высоту этого вида в ненулевое значение. Представление таблицы учитывает только высоту вашего прямоугольник рамки вида; он регулирует ширину вашего заголовка автоматически для соответствия ширине табличного представления.

Таким образом, вы должны установить размер заголовка перед его установкой.

Если ваш заголовок имеет высоту, которая зависит от его содержимого, вот возможное решение:

let header = HeaderView()
let widthConstraint = header.widthAnchor.constraint(equalToConstant: view.bounds.width)
header.translatesAutoresizingMaskIntoConstraints = false
widthConstraint.isActive = true
let targetSize = header.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
header.frame.size.height = targetSize.height
widthConstraint.isActive = false
header.translatesAutoresizingMaskIntoConstraints = true
tableView.tableHeaderView = header

Подождите viewDidLayoutSubviews(), чтобы получить фактический размер view.

Если ваш контент статический, просто установите его высоту:

let header = HeaderView()
header.frame.size.height = 30
tableView.tableHeaderView = header

Обратите внимание, что заголовок autoresizingMask не должен содержать flexibleHeight (проверьте ваш xib). В заголовке должна быть указана высота.

0 голосов
/ 28 марта 2019

Вы можете дать более низкий приоритет ограничению по нижнему интервалу и более высокий приоритет по ограничению по высоте

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