2017-05-08 3 views
0

사용자 지정 하위 클래스가 UICollectionViewFlowLayout인데 항상 셀 너비를 화면 너비로 업데이트하려고합니다. 가로로 회전하면 셀이 제대로 업데이트되지 않습니다. 여기UICollectionViewFlowLayout 하위 클래스의 셀 너비 업데이트 문제

// MARK: - Constants 

private let EdgeInset: CGFloat = 10 
private let CellSpacing: CGFloat = 10 
private let LineSpacing: CGFloat = 10 
private let CellHeight: CGFloat = 50 

// MARK: - FullWidthLayout 

class FullWidthLayout: UICollectionViewFlowLayout { 

    override init() { 
     super.init() 
     commonInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     commonInit() 
    } 

    func commonInit() { 
     minimumLineSpacing = LineSpacing 
     minimumInteritemSpacing = CellSpacing 
     sectionInset = UIEdgeInsets(top: EdgeInset, left: EdgeInset, bottom: EdgeInset, right: EdgeInset) 
    } 
} 

// MARK: Layout Methods 

extension FullWidthLayout { 

    override func prepare() { 
     super.prepare() 

     if let view = collectionView { 
      let availableWidth = view.bounds.width - EdgeInset * 2 
      itemSize = CGSize(width: availableWidth, height: CellHeight) 

      print("Item size: \(itemSize)") 
     } 
    } 
} 

콘솔의 출력은 다음과 같습니다 :

Item size: (300.0, 50.0) 
Item size: (548.0, 50.0) 

그리고 여기 시뮬레이터에서 일어나고있는 작업은 다음과 같습니다

portrait version of my app

landscape version of my app

항목 크기는 여기 내 서브 클래스입니다 올바르게 설정되어있는 것 같습니다. prepare() 메서드이지만 셀이 컬렉션 뷰에서 업데이트되지 않습니다. 가로 모드에서 시작하여 세로 모드로 이동하면 예외가 발생합니다.

내가 누락 된 자료가 있습니까? 어떤 경우에는베이스 UICollectionViewFlowLayoutitemSize을 무시합니까? 여기

는 GitHub의에서 프로젝트에 대한 링크입니다 : CollectionViewRotate

답변

0

당신의 ViewController이 추가

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
     return CGSize(width: collectionView.frame.size.width/ 2 - 10, height: 100) // chnage as per your need ...10 is the space between cell 
    } 

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) { 
    myCollectionView!.reloadData() 
} 
레이아웃에서 항목 크기를 알아낼 수없는 경우는 해당 대리자 메서드를 구현해야
+0

의 개인적인. 레이아웃이 자체 항목 크기를 설정할 수 있어야합니다. – Mark