Персонализирано оформление за изглед на колекция в swift?

Имам 7 клетки в една секция в UICollectionView. Търсих с часове, но всичко, което мога да намеря, е информация за CollectionFlow и персонализирани оформления със стотици клетки. Всичко, което искам, е да покажа 7 клетки с различни идентификатори в изглед на колекция, като използвам оформление като това изображение:

въведете описание на изображението тук

Как мога да постигна това оформление?


person eeschimosu    schedule 07.04.2015    source източник
comment
къде трябва да са клетките?   -  person Gerald    schedule 06.02.2016
comment
В UICollectionView. Те трябва да са асиметрични като изображението по-горе.   -  person eeschimosu    schedule 07.02.2016
comment
така че всяко сиво поле е клетка? предполагам ли, че има повече, тъй като поискахте 7 клетки в раздел, но диаграмата показва само 3   -  person Gerald    schedule 07.02.2016
comment
Да и трябва да са 7 такива. Това е пример с първите 3.   -  person eeschimosu    schedule 07.02.2016


Отговори (4)


Следвайте този URL стъпка по стъпка....

SWIFT:

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

ЦЕЛ C:

https://github.com/eoghain/RBCollectionViewBalancedColumnLayout

person Rahul Mayani    schedule 07.04.2015
comment
Успях да го реша, като използвах първия урок за Swift. - person eeschimosu; 07.02.2016

Това е моето решение.

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)
        }
    }
}
person Max Vitruk    schedule 19.03.2016

Две решения за вас според мен:

Мисля, че имате всичко необходимо! ;)

person Masterfego    schedule 07.04.2015

Възможно е с FlowLayout, но трябва да персонализирате атрибутите на FlowLayout.

За различни размери на клетките използвайте този метод -

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
person Uttam Sinha    schedule 07.04.2015