Ошибка ограничения с UITableViewAutomaticDimension - PullRequest
0 голосов
/ 19 мая 2018

У меня проблемы с настраиваемыми ячейками tableView с динамической высотой.

Поэтому я получаю предупреждение "Невозможно одновременно удовлетворить ограничения". (но иногда, например, 1 изтысячу раз)


Я думаю, что UITableViewAutomaticDimension дает проблему.В примере ожидается высота 88.3333, но, возможно, это неверно.(Но в большинстве случаев это работает, я не понимаю, что происходит)

Что я делаю не так, кто-нибудь может помочь?Перепробовал все ..

Код:

var cellHeights: [IndexPath : CGFloat] = [:]
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        cellHeights[indexPath] = cell.frame.size.height

        if indexPath.row == UserWorldMessagesStore.shared.worldMessages.count - 1 && userWorldMessagesCanLoadMore == true {
            loadOlderOwnWorldMessages()
        }
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }
    func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
        if cellHeights[indexPath] != nil {
            return CGFloat(Float(cellHeights[indexPath] ?? 0.0))
        }
        else {
            return UITableViewAutomaticDimension
        }
    }

Предупреждение:

2018-05-19 19:58:54.879876+0200 PipeTest[3378:1282243] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    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:0x1c0297fc0 V:|-(10)-[UILabel:0x125d5db40'Heyy']   (active, names: '|':UIView:0x125d03400 )>",
    "<NSLayoutConstraint:0x1c0298010 V:[UILabel:0x125d5db40'Heyy']-(10)-|   (active, names: '|':UIView:0x125d03400 )>",
    "<NSLayoutConstraint:0x1c0298100 PipeTest.profilePictureImageView:0x125d56fc0.height == 22   (active)>",
    "<NSLayoutConstraint:0x1c0298240 UIView:0x125e58150.height == 27   (active)>",
    "<NSLayoutConstraint:0x1c0298600 PipeTest.profilePictureImageView:0x125d56fc0.top == UITableViewCellContentView:0x125d50850.topMargin   (active)>",
    "<NSLayoutConstraint:0x1c02986a0 V:[PipeTest.profilePictureImageView:0x125d56fc0]-(3)-[UIView:0x125d03400]   (active)>",
    "<NSLayoutConstraint:0x1c02988d0 UIView:0x125e58150.bottom == UITableViewCellContentView:0x125d50850.bottomMargin   (active)>",
    "<NSLayoutConstraint:0x1c0298970 V:[UIView:0x125d03400]-(7)-[UIView:0x125e58150]   (active)>",
    "<NSLayoutConstraint:0x1c0299230 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x125d50850.height == 88.3333   (active)>"
)

1 Ответ

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

Полный текст предупреждения должен содержать что-то вроде

Will attempt to recover by breaking constraint  
<NSLayoutConstraint:somePointer V:some constraint>

Понижение приоритета этого ограничения до 999 должно заставить это предупреждение исчезнуть.

Причина этого в следующей строке:

<NSLayoutConstraint:0x1c0299230 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x125d50850.height == 88.3333   (active)>

Это системное ограничение, которое сообщает табличному представлению, какой должна быть высота ячейки, и ее значение основано на том, что вы возвращаете из estimatedHeightForRowAt.Предупреждение выдается до того, как будет вычислен правильный размер ячейки (в конце концов, он будет рассчитан должным образом), поэтому можно просто снизить приоритет какого-либо другого ограничения, чтобы системный приоритет имел приоритет.

...