본문 바로가기

iOS

collectionView 오른쪽 정렬

728x90
반응형
SMALL

formagran 님께서 잘 정리해주셔서

https://fomaios.tistory.com/entry/iOSUI-%EC%BB%AC%EB%A0%89%EC%85%98%EB%B7%B0%EC%85%80-%EC%9E%90%EB%8F%99%EC%9C%BC%EB%A1%9C-%ED%81%AC%EA%B8%B0-%EC%A1%B0%EC%A0%95%ED%95%98%EA%B3%A0-%EC%99%BC%EC%AA%BD-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0-CollectionViewCell-Automaticsize-LeftAlign

대충 오른쪽 정렬 만듬 collectionViewFlowlayout 잡을 때 이렇게 잡아주면 끝.

 

class CollectionViewRightAlignFlowLayout: UICollectionViewFlowLayout {

    let cellSpacing: CGFloat = 0

    let cellItemSize: Double

    init(cellItemSize: Double){

        self.cellItemSize = cellItemSize

        super.init()

    }

    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

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

        self.minimumLineSpacing = 0.0

        self.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom:0, right: 0)

        let attributes = super.layoutAttributesForElements(in: rect)

 

        var rightMargin = sectionInset.right

        var maxY: CGFloat = 10

        attributes?.forEach { layoutAttribute in

            if layoutAttribute.frame.origin.y >= maxY {

                rightMargin = sectionInset.right

            }

            print(collectionViewContentSize.width)

            layoutAttribute.frame.origin.x =  collectionViewContentSize.width - rightMargin - cellItemSize

            rightMargin += layoutAttribute.frame.width + cellSpacing

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

        }

        return attributes

    }

}

 

 

11월 18일 위의 코드는 오류나는 걸 찾음. 아래 코드로 사용하면 해결됌.

 

class CollectionViewRightAlignFlowLayout: UICollectionViewFlowLayout {

    let cellSpacing: CGFloat = 4

    let cellItemSize: Double

    init(cellItemSize: Double){

        self.cellItemSize = cellItemSize

        super.init()

    }

    required init?(coder: NSCoder) {

        fatalError("init(coder:) has not been implemented")

    }

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

        self.minimumLineSpacing = 4.0

        self.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom:0, right: 16)

        guard let superArray = super.layoutAttributesForElements(in: rect) else { return nil }

        guard let attributes = NSArray(array: superArray, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil }

        var rightMargin = sectionInset.right

        var maxY: CGFloat = 300

        attributes.forEach { layoutAttribute in

            if layoutAttribute.frame.origin.y >= maxY {

                rightMargin = sectionInset.right

            }

            layoutAttribute.frame.origin.x =  collectionViewContentSize.width - rightMargin - cellItemSize

            rightMargin += layoutAttribute.frame.width + cellSpacing

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

        }

        return attributes

    }

}

728x90
반응형
LIST

'iOS' 카테고리의 다른 글

레이아웃 부서지면 쓰는 사이트  (0) 2022.11.18
rename 꼬일 때  (0) 2022.11.17
collectionView 가 여러개일때  (0) 2022.11.15
앱 실행되는 전체 과정  (0) 2022.10.14
TIL - [iOS]Class, Struct 차이  (0) 2022.09.05