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.