2017-01-25 5 views
0

Я новичок в разработке iOS, и я разрабатываю приложение для покупки/продажи. Я пытаюсь создать представление коллекции, где я не устанавливаю размер ячейки представления коллекции. Вместо этого это будет зависеть от пользователя, который публикует то, что они продают. Я понял, что при жестком кодировании размеров ящиков все выглядит «квадратно». Любые предложения будут ценны.Пользовательская коллекция view cell in swift

+0

Итак, вы хотели бы отрегулировать рамку ячеек динамически? –

+0

Вы должны проверить методы UICollectionViewFlowLayoutDelegate. – Aakash

+0

@ EricZhang да точно –

ответ

3

Предполагая, что вы используете раскладку потока по умолчанию, есть два варианта:

  1. Вы можете иметь самостоятельно проклейку клетку, если вы:

    • определяет однозначные ограничения между вашей ячейкой и его подпункты;

    • не определяют ограничения фиксированной ширины/высоты для изображения;

    • установить estimatedItemSize из ваших UICollectionViewFlowLayout:

      let layout = collectionView?.collectionViewLayout as! UICollectionViewFlowLayout 
      layout.estimatedItemSize = CGSize(width: 100, height: 100) 
      

    Авто макет будет затем изменить вид изображения, чтобы подогнать изображение, а ячейка будет изменять размеры себя, чтобы соответствовать, что, соответственно. Так, например, с некоторыми случайными размерами изображения, стандартная раскладка поток будет автоматически изменять размеры ячеек для нас:

    sample collection view

    Теперь это простая клетка со случайно размера, твердого цветного изображения в изображении вид и ограничения H:|[imageView]| и V:|[imageView]|, но та же идея работает и со сложными ячейками. Вам просто нужно убедиться, что верхние/нижние и ведущие/конечные ограничения ячеек недвусмысленны.

    Обратите внимание, что если вы полагаетесь на неявный размер изображения, это предполагает, конечно, что изображения уже имеют размерность для устройства. Если нет, вы можете создать ограничения для высоты/ширины изображения, включите в них @IBOutlet ссылки, а затем установите constant для этих ограничений в вашем методе cellForRowAtIndexPath. Но, чтобы эффективно управлять памятью, вы вообще хотите уменьшить размер изображений до нужного размера, так что это вообще не нужно.

  2. В качестве альтернативы вы можете указать делегат (UICollectionViewDelegateFlowLayout) раскладки потока, а затем реализовать sizeForItemAt:.

+0

спасибо за долю, это действительно помогло мне разобраться с Collectionveiwlayout. Поэтому я хочу, чтобы ширина ячейки оставалась неизменной, но высота может быть динамически изменена. Должен ли я просто установить ограничение ширины для каждого окна? –

+0

Да, вы можете просто установить ограничение ширины. Но я бы тогда не полагался на автоматическую компоновку, сочетающую это исправление с ограничением плюс вычисление высоты изображения неявно из комбинации не только размеров изображения, но также и ограничения фиксированной ширины. (Это действительно замечательно, но это не идеально.) Итак, если у вас будет ограничение фиксированной ширины, я бы добавил выход к ограничению высоты и установил его 'constant' соответственно. Хитрость заключается в том, что ограничение динамической высоты должно иметь приоритет ниже 1000 (даже 999 достаточно). – Rob

+0

Другая альтернатива - потерять высоту ячейки на основе ограничений и вернуться к ['sizeForItemAt:'] (https://developer.apple.com/reference/uikit/uicollectionviewdelegateflowlayout/1617708-collectionview). – Rob

Смежные вопросы