Custom layout for collection view in swift?

前端 未结 4 1813
攒了一身酷
攒了一身酷 2021-01-03 07:03

I have 7 cells in one section in a UICollectionView. I have searched for hours but all I can find is information about CollectionFlow and Custom layouts with hundreds of cel

相关标签:
4条回答
  • 2021-01-03 07:11

    That is my solution.

    class HistoryLayout: UICollectionViewLayout {
    
        var delegate : HistoryLayoutDelegate?
    
        var yOffSet : CGFloat = 0
        var xOffSetLand : CGFloat = 0
        var xOffSetPort : CGFloat = 0
    
        var portraitElements : [Int] = []
    
        var portraintItemPositionIndex = PortraintItemPositionIndex.Left
    
        private var cache = [CGRect]()
    
        var contentHeight: CGFloat  = 0.0
        var contentWidth: CGFloat {
            let insets = collectionView!.contentInset
            return CGRectGetWidth(collectionView!.bounds) - (insets.left + insets.right)
        }
    
        override func collectionViewContentSize() -> CGSize {
            return CGSize(width: contentWidth, height: contentHeight)
        }
    
        override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    
            var layoutAttributes = [UICollectionViewLayoutAttributes]()
    
            for item in 0 ..< collectionView!.numberOfItemsInSection(0) {
                let indexPath = NSIndexPath(forItem: item, inSection: 0)
    
                let attributes = UICollectionViewLayoutAttributes(forCellWithIndexPath: indexPath)
                attributes.frame = cache[item]
                if CGRectIntersectsRect(attributes.frame, rect) {
                    layoutAttributes.append(attributes)
                }
            }
    
            //send index list of elements with portraint position
            if let _ = delegate {
                delegate?.elementsWithVerticalPosition(self.portraitElements)
            }
    
            return layoutAttributes
        }
    
        override func prepareLayout() {
    
            if cache.isEmpty {
                var gropCount = Int(collectionView!.numberOfItemsInSection(0) / 3)
    
                if collectionView!.numberOfItemsInSection(0) % 3 != 0 {
                    gropCount++
                }
    
                for index in 1...gropCount {
    
                    self.improGroupByItem(index)
    
                    contentHeight = ((contentWidth / 3) * 2) * CGFloat(index)
                }
            }
        }
    
    
        private func improGroupByItem(index : Int){
            if index % 2 == 0 {
                xOffSetLand = contentWidth / 3
                xOffSetPort = 0
                self.portraintItemPositionIndex = .Right
            }else{
                xOffSetLand = 0
                xOffSetPort = (contentWidth / 3) * 2
                self.portraintItemPositionIndex = .Left
            }
    
            if index > 1 {
              self.yOffSet += (contentWidth / 3) * 2
            }
    
            addItemToStack(index)
        }
    
        func addItemToStack(gIndex : Int){
            let columnWidth = self.contentWidth / 3
            var frame : CGRect
    
            var dublicate = 0
    
            for index in 1...3 {
                if index % portraintItemPositionIndex.rawValue == 0 {
                    let width = columnWidth * 1
                    let height = columnWidth * 2
                    frame = CGRect(x: self.xOffSetPort, y: yOffSet, width: width, height: height)
    
                    let indexOfPortElement = ((gIndex - 1)*3) + index - 1
                    portraitElements.append(indexOfPortElement)
                }else{
                    let width = columnWidth * 2
                    let height = columnWidth * 1
                    frame = CGRect(x: self.xOffSetLand, y: yOffSet + (height * CGFloat(dublicate)), width: width, height: height)
                    dublicate++
                }
    
                cache.append(frame)
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-03 07:12

    Follow this URL step by step....

    SWIFT :

    http://www.raywenderlich.com/78550/beginning-ios-collection-views-swift-part-1

    OBJECTIVE C :

    https://github.com/eoghain/RBCollectionViewBalancedColumnLayout

    0 讨论(0)
  • 2021-01-03 07:28

    Two solutions for you I think:

    • use a library: https://github.com/bryceredd/RFQuiltLayout

    • use FlowLayout: https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/UsingtheFlowLayout.html

    I think you have all you need! ;)

    0 讨论(0)
  • 2021-01-03 07:36

    It is possible with the FlowLayout, but you have to customize the FlowLayout Attributes.

    For different cell sizes use this method -

    -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
    
    0 讨论(0)
提交回复
热议问题