Привет, я пытаюсь сделать пузырь UITableviewCell
. ячейка имеет UILabel
со всеми edges
контактами по краям ячейки ContentView
, а UITableView
использует AutomaticHeight
(основано на Label.text
). Я установил изображение CellBackgroundView
в качестве функции ниже
func changeImage(_ name: String) -> UIImage? {
guard let image = UIImage(named: name) else { return nil }
return image.resizableImage(withCapInsets: UIEdgeInsets(top: 17, left: 30, bottom: 17, right: 30), resizingMode: .stretch).withRenderingMode(.alwaysTemplate)
}
выше функция вызывается в cellforRowAtIndexPath
cell.backgroundView = UIImageView(image: changeImage("right_bubble"))
У меня фоновое изображение выглядит как пузыри
Проблема в том, что я не могу изменить левый или правый padding
из Cell
. Есть ли способ изменить отступ (может быть левым или правым) (чтобы различать отправителя и получателя) или нужно изменить с UITableView
на UICollectionView
?
Редактировать: Я предложил решение динамически изменять ограничение в подклассе Custom Cell. Ниже приведена реализация подкласса
import UIKit
enum Direction {
case left
case right
}
class MessageCell: UITableViewCell {
@IBOutlet weak var backgroundImageView: UIImageView!
@IBOutlet weak var messageText: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func prepareForReuse() {
self.layoutIfNeeded()
}
func configureCell(with message: Message, direction: Direction ) {
self.messageText?.text = message.text
switch direction {
case .left:
backgroundImageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 10).isActive = true
contentView.trailingAnchor.constraint(greaterThanOrEqualTo: backgroundImageView.trailingAnchor, constant: 50).isActive = true
self.backgroundImageView.image = UIImage.changeImage("left_bubble")
self.backgroundImageView.tintColor = .lightGray
case .right:
backgroundImageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -10).isActive = true
backgroundImageView.leadingAnchor.constraint(greaterThanOrEqualTo: contentView.leadingAnchor, constant: 50).isActive = true
self.backgroundImageView.image = UIImage.changeImage("right_bubble")
self.backgroundImageView.tintColor = .blue
}
self.layoutIfNeeded()
}
}
, но возникает проблема с Autolayout
, когда число строк превышает высоту экрана и требует прокрутки. Сильфон это ошибка
2018-11-03 19:53:36.478275+0800 VicGithubDM[2352:34611] [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:0x6000006e9090 V:|-(10)-[UILabel:0x7fe37dd3bb70'still have some bugs stil...'] (active, names: '|':UITableViewCellContentView:0x7fe37dd3b750 )>",
"<NSLayoutConstraint:0x6000006ea620 V:[UILabel:0x7fe37dd3bb70'still have some bugs stil...']-(10)-| (active, names: '|':UITableViewCellContentView:0x7fe37dd3b750 )>",
"<NSLayoutConstraint:0x6000006e1d10 'UIView-Encapsulated-Layout-Height' UITableViewCellContentView:0x7fe37dd3b750.height == 1.19209e-07 (active)>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000006ea620 V:[UILabel:0x7fe37dd3bb70'still have some bugs stil...']-(10)-| (active, names: '|':UITableViewCellContentView:0x7fe37dd3b750 )>