Вставьте одну ячейку в горизонтальном UICollectionView вправо

Я реализую элемент управления, который ведет себя как NSTokenField (например, для выбора адреса в Mail) для использования в iOS. Я использую горизонтальную UICollectionView, а моя самая правая ячейка - UITextField. Этот элемент управления появится в форме с другими текстовыми полями, которые имеют выравнивание по правому краю текста. Чтобы мой новый элемент управления выглядел правильно в этом контексте, я хотел бы, чтобы UITextField всегда находился на правом краю UICollectionView и для выбранных тегов отображался слева от него.

В настоящий момент, когда я впервые нажимаю на эту строку, текстовое поле прокручивается влево, а затем оно направляется вправо, когда добавляются новые теги. Как только он закроется с правым краем UICollectionView (когда на изображении ниже добавляется "Закуска" ), я начинаю получать нужное поведение.

Выбор тегов

Я думал о чем-то вроде минимальной ширины на UITextField, поэтому он занимает столько же ширины, сколько и доступно вначале, и все меньше и меньше по мере добавления тегов. Или поочередно, чтобы связать поле с фиксированным полем вправо. Хотя я не нашел способ реализовать эти идеи!

Как я могу сделать это так, чтобы текстовое поле всегда находилось справа от UICollectionView?

Ответ 1

Вот решение, в котором UITextField не является частью UICollectionView.

введите описание изображения здесь

Я добавил collectionView и textField на свою раскадровку со следующими ограничениями макета: CollectionView: переход на супервизор, высоту, верхнее представление, горизонтальное расстояние с textField. TextField: Высота, равная коллекцииView, Trailing to superview, Width = 100, горизонтальное расстояние с помощью коллекцииView.

Я создал IBOutlet для ограничения ширины textField. Ширина изменяется динамически по мере ввода текста.

Свифт 3 Пример кода

class ViewController: UIViewController {

    @IBOutlet weak var collectionView: UICollectionView!
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var textFieldWidthConstraint: NSLayoutConstraint!

    var textArray: [String] = [String]()

    @IBAction func editingChanged(_ sender: AnyObject) {
        let size = textField.sizeThatFits(textField.frame.size)
        textFieldWidthConstraint.constant = max(size.width,100)

        if textArray.count > 0 {
            self.collectionView.scrollToItem(at: IndexPath(row: self.textArray.count-1, section: 0), at: .right, animated: true)
        }
    }

    @IBAction func addText(_ sender: AnyObject) {
        if textField.text?.characters.count ?? 0 > 0 {
            textArray.append(textField.text!)
            textField.text = ""
            textFieldWidthConstraint.constant = 100
            let newIndexPath = IndexPath(row: textArray.count-1, section: 0)
            collectionView.insertItems(at: [newIndexPath])
            collectionView.performBatchUpdates({
                }, completion: { (_) in
                    self.collectionView.scrollToItem(at: newIndexPath, at: .right, animated: true)
            })
        }
    }

}

Ответ 2

Как часть UICollectionViewDataSource

Попробуйте использовать

//Возвращаемое представление должно быть получено из вызова -dequeueReusableSupplementaryViewOfKind: withReuseIdentifier: forIndexPath: - (UICollectionReusableView *) collectionView: (UICollectionView *) collectionView viewForSupplementaryElementOfKind: (NSString *) вид atIndexPath: (NSIndexPath *) indexPath;

И определите свое представление, которое содержит текстовое поле как нижний колонтитул.