1

그리드의 셀을 표시하는 콜렉션 뷰가 필요합니다. 따라서 표준 흐름 레이아웃은 저에게 좋습니다. 그러나 셀 높이가 셀에 놓인 자동 레이아웃 제약 조건에 따라 결정되어야하는 반면 행 당 표시 할 셀의 수는 알려야합니다. 여기 내 셀 레이아웃입니다 :autolayout에 의해서만 UICollectionView 셀 높이를 결정하십시오.

enter image description here

그것은 매우 간단합니다 - 이미지보기와 그 아래 두 개의 레이블. 이제 이미지보기에는 종횡비 제약 조건 (1 : 1)이 있습니다. 즉, 너비가 셀에 알려져있을 때마다 높이가 자동 레이아웃 규칙에 의해 자동으로 인식되어야합니다 (celltop-image-label1 -label2-cellbottom). '

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let availableWidth = collectionView.frame.width - padding 
    let widthPerItem = availableWidth/itemsPerRow 

    return CGSize(width: widthPerItem, height: widthPerItem) 
} 

당신이 볼 수 있듯이, 내가 돈 때문에 : 나는 행당 2 개 항목을 표시 컬렉션보기를 알려줄 수있는 다른 좋은 방법을 알고하지 않기 때문에 지금

, 나는 UICollectionViewDelegateFlowLayout 방법을 재정의 아이템 높이를 알지 못한다. 너비와 같은 것을 반환한다. autolayout이 나중에 그것을 고치기를 희망한다. 또한 전체 메커니즘이 작동하기 시작하기 위해 estimatedItemSize을 설정했습니다.

결과는 매우 이상한 - 주로 라벨 길이에 따라되지 이벤트가 계정에 내가 거기에 돌아 폭을 않는 콜렉션 뷰처럼 보인다 : 나는 다른 보았다

enter image description here

사람들은 너비에 대한 셀 크기를 수동으로 계산할 것을 권장합니다. 예를 들어 "레이아웃을 직접 말하고 너 자신을 측정 한 다음이 너비에 맞는 크기를 지정하십시오."라고 대답하고 심지어 자동 레이아웃 규칙을 실행하지만 수동으로 크기를 어지럽히 지 않고이 작업을 수행 할 수있는 방법이 있는지 확인하십시오.

답변

0

당신은 쉽게 다음과 같이 스토리 보드의 크기 관리자에 collectionView 셀의 높이를 알 수 있습니다 :

enter image description here

지금, 여기에서이 높이를 선택하고, 오버라이드 (override)에 전달 UICollectionViewDelegateFlowLayout 방법 :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    let availableWidth = collectionView.frame.width - padding 
    let widthPerItem = availableWidth/itemsPerRow 

    return CGSize(width: widthPerItem, height: **114**) 
} 

원하는 출력을 얻을 수 있습니다.

+0

나는 모든 것이 autolayout에 의해 처리되기를 원했고, 하드 코드 된 높이는 다른 화면 크기에 따라 실제 높이가 다르기 때문에 더 이상 작동하지 않을 것입니다. – frangulyan

0

나는 모든 것을 자동 레이아웃으로 이동시키는 트릭을 구현했다. 델리게이트 메서드 func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize을 완전히 제거하고 인터페이스 빌더에서 셀 내용에 대한 너비 제약 조건을 추가했습니다 (초기 값을 중요하지 않게 설정). 세포가 생성 될 때

class MyCell: UICollectionViewCell { 

    @IBOutlet weak var cellContentWidth: NSLayoutConstraint! 

    func updateCellWidth(width: CGFloat) { 
     cellContentWidth.constant = width 
    } 
} 

나중에, 내가 행 당 원하는 세포의 수에 따라 미리 계산 된 값으로 폭 제한 조건을 갱신 : 그럼, 사용자 지정 셀 클래스에서 해당 제약 조건에 대한 출구를 만들어 :

private var cellWidth: CGFloat { 
    let paddingSpace = itemSpacing * (itemsPerRow - 1) + sectionInsets.left + sectionInsets.right 
    let availableWidth = collectionView.frame.width - paddingSpace 
    return availableWidth/itemsPerRow 
} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "MyCell", for: indexPath) as! MyCell 

    ... 

    cell.updateCellWidth(width: cellWidth) 

    return cell 
} 

그리고 자동 레이아웃 셀 크기 조정을 사용하면 셀을 올바르게 레이아웃합니다.