Как настроить Размер ячейки UICollectionView для каждого класса размера?

Я нахожу трение при попытке создать отзывчивый / адаптивный UICollectionViewCells на UIStoryboard.

проблема, которую я вижу, заключается в том, что вы, похоже, не можете установить Cell Size per Size Class и я пытаюсь выяснить, правильный подход к этому. Я разработал клетки, чтобы приспособиться к их контейнерам, так что они должны autosize независимо от класса размера. Это в основном работает в том, что если я изменю класс размера, выберите мой вид ячейки и сделайте Update Frames затем они все подогнать их новый размер. Однако это сделка с одним выстрелом, если я вернусь к классу Any / Any size, я все еще вижу эту измененную версию.

вот, что я знаю, я мог бы попробовать:

  • Создайте несколько ячеек с фиксированными размерами, по одной на класс размера и в виде раскадровки. Тогда я мог только ... --9-->использовать правильный во время выполнения, но я мог бы тогда посмотреть их во время разработки.
  • я мог бы создать представление коллекции для каждого класса размера, каждый из которых устанавливается только для этого размера. Это будет работать, но было бы больно управлять несколькими UICollectionViews
  • создайте мой интерфейс и / или ограничения программно (теряя видимость дизайна).

Я надеюсь, что это решенный сценарий, и я просто что-то упускаю, но я знаю, что это может быть то, что инструменты IB не соответствуют коду на данный момент.

4 ответов


решение, которое я придумал, было просто использовать тег UICollectionViewDelegateFlowLayout и реализовать sizeForItemAtIndexPath метод. Это означает, что размеры ячеек могут быть установлены в соответствии с доступным Size Class габариты.

Это все еще не идеально, как вы не можете посмотреть изменения в раскадровке, и вы не можете создать универсальный дизайн и увидеть его в различных форматах.

Я все еще надеюсь, что у кого-то есть лучший вариант.


вот аналогичное решение, закодированное в Swift. Я просто стилизовал обе свои ячейки в раскадровке и оставил их видимыми для любой комбинации классов размера. Когда коллекция признаков изменяется, я обновляю cellSize и cellReuseID, которые хочу использовать, и говорю collectionView перезагрузить все видимые ячейки. Тогда

collectionView(collectionView: UICollectionView,
    layout collectionViewLayout: UICollectionViewLayout,
    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize

и

override func collectionView(collectionView: UICollectionView,
    cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell

(не показано в примере кода) вызываются, что позволяет мне обновлять размер ячейки и обновлять стиль раскадровки ячейки. Так не совсем сделано в раскадровке, но достаточно хорошо, пока в Xcode не будет предоставлена дополнительная поддержка.

struct MyCollectionViewConstants{
    static let CELL_ANY_ANY_REUSE_ID = "cell";
    static let CELL_COMPACT_REGULAR_REUSE_ID = "cellSmall"
    static let CELL_ANY_ANY_SIZE = 100;
    static let CELL_COMPACT_REGULAR_SIZE = 70;
}

class MyCollectionView: UICollectionViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
    var cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID


    func collectionView(collectionView: UICollectionView,
        layout collectionViewLayout: UICollectionViewLayout,
        sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{

        return CGSize(width: cellSize, height: cellSize)
    }

    override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
        super.traitCollectionDidChange(previousTraitCollection)

        if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Compact
            && self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClass.Regular){
            cellSize = MyCollectionViewConstants.CELL_COMPACT_REGULAR_SIZE
            cellReuseID = MyCollectionViewConstants.CELL_COMPACT_REGULAR_REUSE_ID
        } else {
            cellSize = MyCollectionViewConstants.CELL_ANY_ANY_SIZE
            cellReuseID = MyCollectionViewConstants.CELL_ANY_ANY_REUSE_ID
        }

        self.collectionView.reloadItemsAtIndexPaths(
            self.collectionView.indexPathsForVisibleItems())
    }
}

Я застрял с той же проблемой после реализации класса(iPad и iPhone).Ну, я нашел решение. Надеюсь, это поможет!

Реализовать UICollectionViewDelegateFlowLayout.

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
    {
         var device = UIDevice.currentDevice().model  
         var cellSize:CGSize = CGSizeMake(155, 109)

         if (device == "iPad" || device == "iPad Simulator") {
            cellSize = CGSizeMake(240, 220) 
         }

         return cellSize
    }

Swift 4
Привет, Коллеги-Разработчики,

это легко сделать, если высота и ширина UICollectionViewCell одинаковы.

enter image description here

шаги
1. Импорт ** UICollectionViewDelegateFlowLayout**
2. Добавьте sizeForItem IndexPath метод UICOllectionView следующим образом

func collectionView(_ collectionView : UICollectionView,layout collectionViewLayout:UICollectionViewLayout,sizeForItemAt indexPath:IndexPath) -> CGSize {
    return CGSize(width: collectionVw.frame.size.height, height: collectionVw.frame.size.height)
}   

Примечание: что происходит, вы устанавливаете высоту UICollectionView как высота и ширина UICollectionViewCell

Удачи В Кодировании :)