Ограничения приводят к ошибкам отладки - PullRequest
0 голосов
/ 16 сентября 2018

Evening all,

Я построил UICollectionView с динамическими ячейками, поэтому высота подстраивается под содержимое внутри.Представление коллекции состоит из изображения профиля слева с именем пользователя, названием элемента и выбранным комментарием рядом с ним.

Я получил всю эту работу, следуя инструкциям, читая статьи и переходя назад и впередПереполнение стека.Тем не менее, в журнале отладки я вижу пару жалоб на ограничения, и я не могу понять, почему они появляются.

Я устанавливаю высоту ячейки на основе всех фиксированных илизначения переменных: высота метки имени пользователя (фиксированная), высота метки заголовка (переменная) и высота комментария (также переменная).Я делаю это в методе collectionView sizeForItemAt, например:

    let dummyTitle = "The title of my item, which can also be very long so I am wondering what will happen now"
    let dummyText = "This is a long text which should automatically adapt inside the cell and then the cell height should also adapt so everything is nice and visible."
    let rectWidth = view.frame.width - 32 - 60 - 16
    let rect = NSString(string: dummyText).boundingRect(with:CGSize(width: rectWidth, height: 1000), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 16)], context: nil)
    let rectTitle = NSString(string: dummyTitle).boundingRect(with:CGSize(width: rectWidth, height: 1000), options: NSStringDrawingOptions.usesFontLeading.union(NSStringDrawingOptions.usesLineFragmentOrigin), attributes: [NSAttributedStringKey.font: UIFont.boldSystemFont(ofSize: 16)], context: nil)
    let variableHeight = 16 + 20 + 2 + 2 + 16 + 1 + rect.height + rectTitle.height
    return CGSize(width: view.frame.width, height: variableHeight)

По сути, я вычисляю высоту двух переменных (метки заголовка и комментария), воссоздавая прямоугольник, а затем получаю высоту их,Чтобы затем сделать ячейки переменными по высоте, я установил ограничения сверху, слева и справа, чтобы нижняя часть была динамичной:

    // horizontal constraints profile pic & username
    addConstraintsWithFormat(format: "H:|-16-[v0(60)]-16-[v1]-16-|", views: profilePictureImageView, usernameLabel)
    // horizontal constraints title
    addConstraintsWithFormat(format: "H:|-92-[v0]-16-|", views: titleLabel)
    // horizontal constraints comment
    addConstraintsWithFormat(format: "H:|-92-[v0]-16-|", views: commentTextView)
    // vertical constraints profile pic & separator
    addConstraintsWithFormat(format: "V:|-16-[v0(60)]-16-[v1(1)]|", views: profilePictureImageView, separatorView)
    // horizontal constraints separator
    addConstraintsWithFormat(format: "H:|[v0]|", views: separatorView)
    // vertical constraints username
    addConstraintsWithFormat(format: "V:|-16-[v0(20)]-2-|", views: usernameLabel)
    // top constraints workout
    addConstraints([NSLayoutConstraint(item: titleLabel, attribute: .top, relatedBy: .equal, toItem: usernameLabel, attribute: .bottom, multiplier: 1, constant: 2)])
    // top constraint comment
    addConstraints([NSLayoutConstraint(item: commentTextView, attribute: .top, relatedBy: .equal, toItem: titleLabel, attribute: .bottom, multiplier: 1, constant: 2)])

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

Редактировать : добавлена ​​часть журнала отладки.Это две из 13 ошибок:

2018-09-16 16:20:30.030871+0200 prjExplanation[12946:529268] [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:0x6040002810e0 V:|-(16)-[UIImageView:0x7fe8b2f1dd00]   (active, names: '|':prjExplanation.socialCell:0x7fe8b2c1c970 )>",
    "<NSLayoutConstraint:0x604000281360 UIImageView:0x7fe8b2f1dd00.height == 60   (active)>",
    "<NSLayoutConstraint:0x6040002816d0 V:[UIImageView:0x7fe8b2f1dd00]-(16)-[UIView:0x7fe8b2c21a70]   (active)>",
    "<NSLayoutConstraint:0x604000281680 UIView:0x7fe8b2c21a70.height == 1   (active)>",
    "<NSLayoutConstraint:0x6040002811d0 V:[UIView:0x7fe8b2c21a70]-(0)-|   (active, names: '|':prjExplanation.socialCell:0x7fe8b2c1c970 )>",
    "<NSLayoutConstraint:0x604000281310 V:|-(16)-[UILabel:0x7fe8b2f1e4f0'Author_203']   (active, names: '|':prjExplanation.socialCell:0x7fe8b2c1c970 )>",
    "<NSLayoutConstraint:0x60400009f8b0 UILabel:0x7fe8b2f1e4f0'Author_203'.height == 20   (active)>",
    "<NSLayoutConstraint:0x60400009c430 V:[UILabel:0x7fe8b2f1e4f0'Author_203']-(2)-|   (active, names: '|':prjExplanation.socialCell:0x7fe8b2c1c970 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6040002816d0 V:[UIImageView:0x7fe8b2f1dd00]-(16)-[UIView:0x7fe8b2c21a70]   (active)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
2018-09-16 16:20:30.043291+0200 prjExplanation[12946:529268] [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:0x6040002820d0 V:|-(16)-[UIImageView:0x7fe8b2f274a0]   (active, names: '|':prjExplanation.socialCell:0x7fe8b2f26bc0 )>",
    "<NSLayoutConstraint:0x604000281ea0 UIImageView:0x7fe8b2f274a0.height == 60   (active)>",
    "<NSLayoutConstraint:0x604000282300 V:[UIImageView:0x7fe8b2f274a0]-(16)-[UIView:0x7fe8b2d0b880]   (active)>",
    "<NSLayoutConstraint:0x604000282120 UIView:0x7fe8b2d0b880.height == 1   (active)>",
    "<NSLayoutConstraint:0x604000281d60 V:[UIView:0x7fe8b2d0b880]-(0)-|   (active, names: '|':prjExplanation.socialCell:0x7fe8b2f26bc0 )>",
    "<NSLayoutConstraint:0x6040002823f0 V:|-(16)-[UILabel:0x7fe8b2f276d0'Author_203']   (active, names: '|':prjExplanation.socialCell:0x7fe8b2f26bc0 )>",
    "<NSLayoutConstraint:0x6040002823a0 UILabel:0x7fe8b2f276d0'Author_203'.height == 20   (active)>",
    "<NSLayoutConstraint:0x604000281ef0 V:[UILabel:0x7fe8b2f276d0'Author_203']-(2)-|   (active, names: '|':prjExplanation.socialCell:0x7fe8b2f26bc0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x604000282300 V:[UIImageView:0x7fe8b2f274a0]-(16)-[UIView:0x7fe8b2d0b880]   (active)>

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