Самоконтроль UICollectionView с FlowLayout и переменным количеством ячеек - PullRequest
0 голосов
/ 29 мая 2018

Обратите внимание, что это НЕ вопрос о самоопределении размера UICollectionViewCell.

Можно ли создать самоопределение размера UICollectionView (с UICollectionViewFlowLayout), размер которого зависит от ячеек внутри него?

У меня есть представление коллекции с переменным количеством ячеек.Я хотел бы ограничить ширину представления коллекции, а затем разрешить его вертикальное расширение в зависимости от количества ячеек.

Этот вопрос похож на этот Динамическая высота CollectionView с Swift 3 в iOS но у меня есть несколько ячеек на строку.

Бонусные баллы, если можно по-прежнему использовать ячейки с собственным размером внутри представления коллекции, но это нормально, если делегат представления коллекции предоставляет размеры ячеек.

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

@ Ответ Михала Горзальчани привел меня к этому ответу (для моего конкретного случая):

  1. Подкласс UICollectionView

    class DynamicCollectionView : UICollectionView {
    
        weak var layoutResp : LayoutResponder?
    
        override func invalidateIntrinsicContentSize() {
            super.invalidateIntrinsicContentSize()
            self.layoutResp?.updateLayout()
        }
    
        override var intrinsicContentSize : CGSize {
            return self.contentSize
        }
    
        override var contentSize: CGSize {
            get { return super.contentSize }
    
            set {
                super.contentSize = newValue
                self.invalidateIntrinsicContentSize()
            }
        }
    }
    
  2. Протокол LayoutResponder должен быть принят в представлении, которое имеет дело на высоком уровне с макетом представления коллекции (у меня относительно сложный макет).

    protocol LayoutResponder : class {
        func updateLayout()
    }
    
    
    extension RespView : LayoutResponder {
        func updateLayout() {
            self.layoutResp?.setNeedsLayout()
            self.layoutResp?.layoutIfNeeded()
        }
    }
    

    В моем случае я на самом деле продвигаюсь updateLayout() еще дальше по цепочке.

Я думаю, для более простых макетов вы можете вообще пропустить шаг 2.

Это, на мой взгляд, немного "хакерский", поэтому, если у кого-то есть лучший подход, я был бы признателен, если бы вы поделились.

0 голосов
/ 29 мая 2018

У меня недостаточно репутации, чтобы комментировать, но я думаю это ответ , который вы ищете.Код ниже:

 class DynamicCollectionView: UICollectionView {
     override func layoutSubviews() {
         super.layoutSubviews()
         if bounds.size != intrinsicContentSize() {
             invalidateIntrinsicContentSize()
         }
     }

     override func intrinsicContentSize() -> CGSize {
         return self.contentSize
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...