Я создаю табличное представление, которое позволяет пользователям комментировать сообщения в моем приложении.Когда создается новый комментарий, я использую метод UITableView.insertRows (at: with :), чтобы добавить новую ячейку комментария в соответствующем месте.
Ячейки добавляются в представление таблицы правильно, но вседругим видимым ячейкам настраивают свои подпредставления, то есть их ограничения сбрасываются до ограничений по умолчанию UITableViewCell.Всякий раз, когда я первоначально удаляю ячейку из очереди, я вызываю cell.layoutSubviews, чтобы установить ограничения ячеек.Это действие отменяется при вставке новой ячейки.
Я обнаружил, что cellForRow (at :) не вызывается для других видимых ячеек, когда вставляется новая ячейка.Мне любопытно, какие функции вызывают для других видимых функций всякий раз, когда вставляется новая ячейка.Таким образом, я могу расположить соответствующие, уже существующие подпредставления ячеек, чтобы решить эту проблему.Вы увидите, что когда мне «нравятся» комментарии, подпредставления ячеек выкладываются соответствующим образом.Это потому, что subviews cell.layout вызывается всякий раз, когда нажимается аналогичная кнопка.
Я использую UITableView.beginUpdates () и UITableView.endUpdates до и после вставки соответственно, и невидимые ячейки, конечно, являются, не затронутые вставкой, поскольку их подпредставления размещаются при снятии с очереди.
Итак, мне просто нужно знать, какие функции вызываются в видимых, уже существующих ячейках после того, как новая ячейкавставлен в табличное представление.
Этот пример переместит вас к видео моей проблемы: https://www.youtube.com/watch?v=7MUr5C9Oj0c&feature=youtu.be
(код ограничений для Пола)
//The following is called on initialization
let viewsDict = ["contentView":contentView,"imageView":imageView,"textLabel":textLabel,"detailTextLabel":detailTextLabel,"timeLabel":timeLabel,"likesLabel":likesLabel,"likeButton":likeButton,"replyButton":replyButton] as [String:Any]
//Horizontal constraints
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[imageView(35)]-[textLabel]-[likeButton(50)]-(-2)-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[imageView(35)]-[detailTextLabel]-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[imageView(35)]-[timeLabel]-[likesLabel]-[replyButton]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
//Vertical constriants
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[imageView(35)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-(-2)-[likeButton(50)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[textLabel]-[detailTextLabel]-[timeLabel]-8-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[textLabel]-[detailTextLabel]-[likesLabel]-8-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[textLabel]-[detailTextLabel]-[replyButton]-8-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
В layoutSubviews я проверяю, является ли комментарий ответом или удален, и корректирую соответствующим образом.Ответы будут иметь отступ, оригинальных сообщений не будет.Удаленные сообщения не влияют на ограничения.Следующее вызывается с layoutSubviews:
//Check if constraints need to be adjusted
if replyTo != nil && !isDeleted {
//Is a reply, isn't deleted
if indentImageView == nil {
addIndentedConstraints()
}
} else if replyTo == nil && isDeleted {
//Isn't a reply and is deleted
if indentImageView != nil {
removeIndentedConstraints()
}
} else if replyTo == nil && !isDeleted {
//Isn't a reply and isn't deleted
if indentImageView != nil {
removeIndentedConstraints()
}
} else if replyTo != nil && isDeleted {
//Is a reply, is deleted
if indentImageView == nil {
addIndentedConstraints()
}
}
И затем функции, которые либо добавляют отступы, либо неиндентифицированные ограничения:
func addIndentedConstraints() {
indentImageView = UIImageView(image: UIImage(named: "indent")?.resize(targetSize: CGSize(width: 36, height: 18)))
contentView.addSubview(indentImageView!)
indentImageView!.translatesAutoresizingMaskIntoConstraints = false
let viewsDict = ["contentView":contentView,"indentImageView":indentImageView,"imageView":imageView,"textLabel":textLabel,"detailTextLabel":detailTextLabel,"timeLabel":timeLabel,"likesLabel":likesLabel,"likeButton":likeButton,"replyButton":replyButton,] as [String:Any]
let indentedConstraints1 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-67.5-[imageView(35)]-[textLabel]-[likeButton(50)]-(-2)-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict)
indentedConstraints1.giveAllConstraints(identifier: "indentedConstraint")
contentView.addConstraints(indentedConstraints1)
let indentedConstraints2 = NSLayoutConstraint.constraints(withVisualFormat: "H:|-25.5-[indentImageView(36)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict)
indentedConstraints2.giveAllConstraints(identifier: "indentedConstraint")
contentView.addConstraints(indentedConstraints2)
let indentedConstraints3 = NSLayoutConstraint.constraints(withVisualFormat: "V:|-[indentImageView(18)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict)
indentedConstraints3.giveAllConstraints(identifier: "indentedConstraint")
contentView.addConstraints(indentedConstraints3)
let indentedConstraints4 = NSLayoutConstraint.constraints(withVisualFormat: "V:|-[imageView(35)]", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict)
indentedConstraints4.giveAllConstraints(identifier: "indentedConstraint")
contentView.addConstraints(indentedConstraints4)
}
func removeIndentedConstraints() {
indentImageView!.removeFromSuperview()
indentImageView = nil
//Loop through all of our contentview's constraints and check if the constraint is an indentedConstraint. Remove this constraint if it is
for constraint in contentView.constraints {
if constraint.identifier == "indentedConstraint" {
contentView.removeConstraint(constraint)
}
}
let viewsDict = ["contentView":contentView,"imageView":imageView,"textLabel":textLabel,"detailTextLabel":detailTextLabel,"timeLabel":timeLabel,"likesLabel":likesLabel,"likeButton":likeButton,"replyButton":replyButton,] as [String:Any]
contentView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-[imageView(35)]-[textLabel]-|", options: NSLayoutConstraint.FormatOptions(rawValue: 0), metrics: nil, views: viewsDict))
}
[NSLayoutConstraint] .giveAllConstraints (identifier :), естественно, даетвсе элементы в массиве NSLayoutConstraint имеют одинаковый идентификатор.Таким образом, я могу выполнить цикл и проверить, является ли ограничение ограничением отступа, а затем удалить только те, которые есть, если это необходимо.