2017-02-14 1 views
2

3 행과 2 열로 배치해야하는 6 개의 요소가있는 컬렉션 뷰가 있습니다. 있는 viewDidLoad에서스위프트 : 컬렉션보기 크기가 올바르게 변경되지 않습니다.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let totalWidth = collectionView.bounds.size.width - 12 
    let totalHeight = collectionView.bounds.size.height - 18 
    let heightOfView = (totalHeight/3) 
    let dimensions = CGFloat(Int(totalWidth)) 

     return CGSize(width: dimensions/2, height: heightOfView) 
} 

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 6 
} 

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { 
    return UIEdgeInsetsMake(0, 5, 0, 5) 
} 

:이 완벽있는 다음과 같습니다 Collection 뷰를 생성

override func viewDidLoad() { 
    super.viewDidLoad() 
    collectionView.dataSource = self 
    collectionView.delegate = self 

    flowLayout.scrollDirection = .horizontal 
    flowLayout.minimumLineSpacing = 5 
    flowLayout.minimumInteritemSpacing = 5 

: 나는 이것을 달성하기 위해 다음 코드를 사용

This is the desired output

그러나 때 뷰가로드되기 전에 상황에 따라 컬렉션 뷰 아래의 뷰를 숨기고 크기를 조정합니다 (높이가 50pt 높이). 그러면 o 상황에 의해 viewWillAppear의보기를 숨길

Collection view appearance when adjusted to account for hidden view

: 오직 2 행 대신에 3 행 사이에 큰 간극 스크롤 않는 화면 오프 세포 (이미지 참조) 다음 4 & 5 변경 utput testVariable 사실이며,이 경우 bottomView을 숨기고 공간을 채우기 위해 collectionView 50 점 더 큰 만드는 경우

override func viewWillAppear(_ animated: Bool) { 

    if testVariable == true { 
     bottomView.isHidden = true 
     // make bottomView height = 0 
     bottomViewHeight.constant = 0 
     // make collectionView space to the bottom of the view controller 0 
     collectionToBase.constant = 0 
     view.layoutIfNeeded() 
    } 
} 

이 코드 테스트 : 나는 다음을 추가했습니다. 나는이 코드를 viewWillAppear에 추가했다. 희망은 collectionViewLayout이 추가로 50pt의 높이를 고려하여 조정하지만 희망은 없다.

+0

다음으로 시도하십시오. 높이가 작은 셀 만들기. –

답변

2

레이아웃을 무효화해야합니다. 그것은 독자적으로 그렇게하지 않습니다. layoutIfNeeded() 호출 후 flow 레이아웃에서 invalidateLayout()을 호출하십시오.

flowLayout.invalidateLayout() 
+0

정말 고마워요, 제 마음을 넘어서지 않았습니다. 좋은 하루 되세요! –

+0

반갑습니다. 나는이 문제를 로테이션과 씨름했다. 나는 돌고 돌았 다. 나는 그것이 화재와 잊기를 원했다. 그렇지 않습니다. –