Мой UICollection View не прокручивается после того, как я настроил для него пользовательский макет - PullRequest
1 голос
/ 26 марта 2020

Прежде чем я использую настроенный UICollectionViewFlowLayout, функция прокрутки работает отлично, но когда я устанавливаю свой макет на UICollectionView, он больше не может прокручиваться, но все содержимое отображается хорошо, потому что мой макет работает.

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

Мой код для моего макета следующий:


class MyLayout : UICollectionViewFlowLayout{

     fileprivate let numberOfColumns = 2
     weak var delegate : MyLayoutDelegate!
     fileprivate var cache = [UICollectionViewLayoutAttributes]()
     fileprivate var contentHeight : CGFloat = 0
     fileprivate var contentWidth : CGFloat{
         guard let collectionView = collectionView else {return 0.0}
         let insets = collectionView.contentInset
         return collectionView.bounds.width - (insets.left + insets.right)
     }
     override var collectionViewContentSize: CGSize{
         return CGSize(width: contentWidth, height: contentHeight)
     }

     override init() {
         super.init()
         self.minimumLineSpacing = 1
         self.minimumInteritemSpacing = 1
     }

     required init?(coder: NSCoder) {
         fatalError("init(coder:) has not been implemented")
     }

     override func prepare() {
         guard let collection = collectionView else {return}
         let columnWidth = contentWidth / CGFloat(numberOfColumns)
         let xOffset: [CGFloat] = [0,columnWidth]
         var yOffset = [CGFloat](repeating: 190, count: numberOfColumns)


         var columnToPlacePhoto = 0
         for item in 0 ..< collection.numberOfItems(inSection: 0){

             let indexPath = IndexPath(item: item, section: 0)
             let photoHeight : CGFloat = delegate.collectionView(collection, numberOfColumns: numberOfColumns, heightForPhotoAtIndexPath: indexPath)
             let frame = CGRect(x: xOffset[columnToPlacePhoto], y: yOffset[columnToPlacePhoto], width: columnWidth, height: photoHeight)
             let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath)
             attributes.frame = frame
             self.cache.append(attributes)

             yOffset[columnToPlacePhoto] = yOffset[columnToPlacePhoto] + photoHeight
             columnToPlacePhoto = columnToPlacePhoto < (numberOfColumns - 1) ? (columnToPlacePhoto + 1) : 0
         }
     }


     //
     override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

         let layoutAttributes = super.layoutAttributesForElements(in: rect)

         layoutAttributes?.forEach({ (attribute) in
             // I did this to keep attribute of Collection View Header, without this step, my Header doesn't show up
             if attribute.representedElementKind == UICollectionView.elementKindSectionHeader{
                 cache.append(attribute)
             }})
         return cache
     }
}

I назначить мой макет представлению коллекции

class ProfileVC: UICollectionViewController, UICollectionViewDelegateFlowLayout, {

    override func viewDidLoad() {
        super.viewDidLoad()

        let layout = MyLayout()
        layout.delegate = self
        self.collectionView.collectionViewLayout = layout
        self.collectionView.isScrollEnabled = true
}

Я также устанавливаю количество элементов, количество секций, размер заголовка и т. д.

    override func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return posts.count
    }

    // Set size of header
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width: view.frame.width, height: 190)
    }

    // Set cell
    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! ProfilePostCell
        cell.post = posts[indexPath.item]
        return cell
    }

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

Но после того, как я добавлю следующее, он не сможет прокрутить. Пожалуйста, помогите мне отсюда, спасибо заранее.

let layout = MyLayout()
        layout.delegate = self
        self.collectionView.collectionViewLayout = layout
        self.collectionView.isScrollEnabled = true

1 Ответ

0 голосов
/ 05 апреля 2020

Я решил эту проблему, добавив.

contentHeight = max(contentHeight, frame.maxY)
...