Я пытаюсь добавить изображение в DTAttributedTextContentView и выровнять его с помощью DTImageTextAttachment следующим образом:
func addAndDisplayImage() { Guard let image = UIImage(named: "test") else { print("Ошибка загрузки изображения") возвращаться } imageTextAttachment.image = image.imageScaled(to: CGSize(ширина: 200, высота: 200)) пусть атрибутString = NSAttributedString (приложение: imageTextAttachment) атрибутTextContentView.attributedString = атрибутстрока let rect: CGRect = атрибутString.boundingRect(с: .init(ширина: 260,0, высота: .greatestFiniteMagnitude), параметры: .usesLineFragmentOrigin, контекст: ноль) widthConstraint.constant = ячейка(rect.width) heightConstraint.constant = ceil(rect.height) макетЕслинеедед() } Однако изображение отображается частично. Вот результат:

Я обнаружил, что в «imageTextAttachment» есть свойствоverticalAlignment, которому можно установить, например, значение .top:
imageTextAttachment.verticalAlignment = .top и результат будет такой:

Но все равно изображение не выравнивается должным образом. Другие значения, такие как .center, .bottom и т. д. тоже не доделал свою работу.
Как правильно настроить изображение, чтобы оно идеально вписывалось в атрибутныйTextContentView?
Вот полный код:
класс ViewController: UIViewController { переопределить функцию viewDidLoad() { супер.viewDidLoad() КонфигурацияКоллекцияView() } // ОТМЕТКА: - Настройка просмотра коллекции пусть CollectionView: UICollectionView = { пусть макет = UICollectionViewCompositionalLayout {(раздел, среда) -> NSCollectionLayoutSection? в пусть itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0), heightDimension: .estimated(1)) пусть элемент = NSCollectionLayoutItem (layoutSize: itemSize) let group = NSCollectionLayoutGroup.vertical(layoutSize: itemSize, подэлементы: [item]) пусть раздел = NSCollectionLayoutSection (группа: группа) раздел.interGroupSpacing = 5 возвратный раздел } макет.конфигурация.scrollDirection = .вертикальный пусть CollectionView = UICollectionView (frame: .zero, CollectionViewLayout: макет) CollectionView.register(ConversationCollectionViewCell.self, forCellWithReuseIdentifier: "ConversationCell") вернуть коллекциюПросмотр }() частная функция configureCollectionView() { CollectionView.dataSource = сам CollectionView.backgroundColor = .коричневый view.addSubview(collectionView) CollectionView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ CollectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor), CollectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor), CollectionView.topAnchor.constraint(equalTo: view.topAnchor), CollectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } } // ОТМЕТКА: - Источник данных сбора расширение ViewController: UICollectionViewDataSource { func CollectionView (_ CollectionView: UICollectionView, раздел NumberOfItemsInSection: Int) -> Int { вернуть 10 } func CollectionView (_ CollectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = CollectionView.dequeueReusableCell(withReuseIdentifier: "ConversationCell", for: indexPath) as! БеседаколлекцияViewCell ячейка.addAndDisplayImage() возвратная ячейка } } финальный класс ConversationCollectionViewCell: UICollectionViewCell, DTAttributedTextContentViewDelegate, DTLazyImageViewDelegate { пусть mainCellContainerView = UIView() пусть атрибутTextContentView = DTAttributedTextContentView() пусть imageTextAttachment = DTImageTextAttachment() вар widthConstraint: NSLayoutConstraint! вар heightConstraint: NSLayoutConstraint! //ОТМЕТКА: - ЖИЗНЕННЫЙ ЦИКЛ переопределить init(frame: CGRect) { super.init(кадр:кадр) настройкаmainCellContainerView() настройкаAttributedTextContentView() макетЕслинеедед() } требуется инициализация?(кодер: NSCoder) { FatalError("init(coder:) не реализован") } // ОТМЕТКА: - UI STEUP частная функция setupmainCellContainerView() { contentView.addSubview(mainCellContainerView) mainCellContainerView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ mainCellContainerView.topAnchor.constraint(equalTo: contentView.topAnchor), mainCellContainerView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor), mainCellContainerView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor), mainCellContainerView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor), ]) } частная функция setupAttributedTextContentView() { mainCellContainerView.addSubview(attributedTextContentView) атрибутTextContentView.delegate = сам атрибутTextContentView.backgroundColor = .systemIndigo атрибутTextContentView.contentMode = .redraw атрибутTextContentView.shouldDrawImages = true атрибутTextContentView.translatesAutoresizingMaskIntoConstraints = false widthConstraint = атрибутTextContentView.widthAnchor.constraint(lessThanOrEqualToConstant: 260.0) heightConstraint = атрибутTextContentView.heightAnchor.constraint(equalToConstant: 80.0) NSLayoutConstraint.activate([ ширинаОграничение, высотаОграничение, атрибутTextContentView.topAnchor.constraint(equalTo: mainCellContainerView.topAnchor), атрибутTextContentView.bottomAnchor.constraint(equalTo: mainCellContainerView.bottomAnchor), ]) } функция addAndDisplayImage() { // Используйте имя изображения из ваших ресурсов Guard let image = UIImage(named: "test") else { print("Ошибка загрузки изображения") возвращаться } imageTextAttachment.image = image.imageScaled(to: CGSize(ширина: 200, высота: 200)) пусть атрибутString = NSAttributedString (приложение: imageTextAttachment) атрибутTextContentView.attributedString = атрибутстрока imageTextAttachment.verticalAlignment = .top let rect: CGRect = атрибутString.boundingRect(с: .init(ширина: 260,0, высота: .greatestFiniteMagnitude), параметры: .usesLineFragmentOrigin, контекст: ноль) widthConstraint.constant = ячейка(rect.width) heightConstraint.constant = ceil(rect.height) макетЕслинеедед() } }
Мобильная версия