CollectionView sizeForItemAtIndexPath가 호출되지 않았습니다.


94

이것은 나를 미치게 만든다! 아래와 같이 UICollectionViewController가 있습니다.

class PhrasesCompactCollectionViewController: UICollectionViewController

numberOfSections 및 cellForItemAt이 호출되지만 sizeForItemAtIndexPath는 호출되지 않습니다. 다른 곳에서 똑같은 코드를 사용하고 있으며 올바르게 실행됩니다. Xcode 8 Beta 6을 사용하고 있습니다.

func collectionView(collectionView: UICollectionView,
                        layout collectionViewLayout: UICollectionViewLayout,
                        sizeForItemAtIndexPath indexPath:  NSIndexPath) -> CGSize {

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

답변:


251

UICollectionViewDelegateFlowLayout클래스 선언에서 프로토콜을 구현하도록 지정해야합니다 .

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout


10
나는 이것을했지만 여전히 호출되지 않았습니다. :(
Van Du Tran

57

에서 스위프트 3+ 이 방법을 사용 :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}

수업이 Delegate를 모두 준수하는지 확인하십시오.

  • UICollectionViewDelegate

  • UICollectionViewDelegateFlowLayout


4
UICollectionViewDelegateUICollectionViewController가 이미 수행 하는 것처럼 준수하는 것은 중복됩니다 .
Van Du Tran

3
그것은 UICollectionViewController이 ... 필요하지 않습니다되고 있기 때문에이 필요하다는 상태로 중복 아니에요 @VanDuTran
마이클 허드슨

컬렉션이 아닌 뷰, Viewcontroller가 UICollectionViewDelegate가 될 수 있음을 의미한다고 생각합니다.
ScottyBlades

1
UICollectionViewDelegateFlowLayout, 그래서 그냥 UICollectionViewDelegateFlowLayout 구현 UICollectionViewDelegate에서 상속
evya

46

나는 같은 문제가 있었다. 저에게 도움이 된 한 가지는 collectionView 크기 검사기 'None'에서 Cell Size에 대한 'Estimated Size'를 만드는 것이 었습니다.

여기에 이미지 설명 입력


8
당신은, 당신이 영웅 나의 일 친구를 저장
아시프 알리

1
어떻게 든 사용에 관한 다른 모든 게시물의 다른 모든 답변은 sizeForItemAt이것을 언급하지 못했습니다. 굉장히 유용하다.
JCutting8

이건 미쳤어 !!!! 10.3.1 iOS 버전으로 iPhone 5 시뮬레이터에서 테스트했으며 메서드가 호출되었습니다. 10.3.1 버전 방법으로 iPhone 5s 시뮬레이터에서 호출되지 않습니다 !!! Estimate Size를 None으로 변경했습니다. iPhone 5s에서 호출되기 시작했습니다. WT WT WT
hasan

감사합니다! 사용자 정의를 사용한 내 컬렉션 뷰는 sizeForItemAt갑자기 셀 너비가 잘못되었을 때 Xcode 11.4까지 잘 작동했습니다. 많은 것을 시도했고 이것은 마침내 작동했습니다.
Filip

당신은 내 시간을 절약했습니다. 감사합니다.
Shahbaz Akram

15

스위프트 3

UICollectionView의 Cell Size를 설정하려면 UICollectionViewFlowLayout. 속성을 사용자 지정하고 해당 레이아웃 개체를 UICollectionView 개체로 설정합니다.

요구 사항 (원하는 셀 높이 및 너비)에 따라 cellheight 및 cell cellWidth 개체를 변경합니다.

override func viewDidLoad() {
    super.viewDidLoad()

    let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
    let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
    let cellSize = CGSize(width: cellWidth , height:cellheight)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}

확인 : sizeForItemAt indexPath 메서드를 추가 한 경우 메서드를 제거해야합니다.

아래 제거 방법

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

12
이것이 어떻게 도움이됩니까?
almas

1
Almas, 이것은 UICollectionViewCell의 사용자 지정 셀 크기를 설정하는 데 도움이됩니다 ... 고유 한 값을 정의 할 수 있다는 점에서 cellWidth 및 cellHeight 변수가 있습니다 ...뿐만 아니라 "layout.sectionInset", "layout.minimumLineSpacing"및 "layout ".minimumInteritemSpacing, 이러한 변수는 UICollectionViewCell 크기에 중요한 ..
Gaurav 라미

2
이것은 모든 셀이 동일한 크기 인 경우에만 작동합니다. 아래의 대답은 정답
JeffN

이것은 UICollectionView의 크기를 변경하기위한 것이지만 뷰 내부의 셀이 아닙니다.
Async-

이 대리자 메서드가 호출되지 않는 이유에 대한 답변하지 않습니다
지브 Kesten

12

스위프트 5

다음 단계가 모두 필요합니다 .

  1. UICollectionViewDelegateFlowLayout 준수 <== 절대적으로 필요합니다 !!
  2. 그리고 UICollectionViewDelegate, UICollectionViewDataSource
  3. 있는 viewDidLoad에서 다음을 설정 collectionView.delegate = self하고collectionView.dataSource = self
  4. 인터페이스 빌더에서 예상 크기를 없음 으로 설정
  5. 다음 메서드에 sizeForItemAtIndexPath 가 아닌 sizeForItemAt 이 있는지 확인하십시오.

같이 :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    return CGSize(width: 100, height:100)
} 

2
크기를 없음으로 추정-하루를 절약하십시오!
Joe Hallenbeck

6

첫 번째 클래스는 UICollectionViewDelegateFlowLayout에 확인해야합니다. 그런 다음 viewDidLoad ()에 다음 코드를 작성해야합니다.

// UICollectionView에 UIViewController의 UICollectionViewDelegateFlowLayout 메서드를 사용하도록 지시합니다.

collectionView.delegate = self

// 컬렉션보기 흐름 레이아웃을 설정하려는 경우

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)

이 코드를 사용하여 UICollectionViewDelegateFlowLayout 메서드

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

이 메서드에서 크기를 설정할 수 있습니다.


4

답이 효과가 없는지 확인해야 할 세 가지 :

  1. FlowLayout Delegate 구현 : class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  2. swift 3.0+의 경우 항목 크기에 대한 사용 방법 : func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }

  3. Estimate size = NoneUICollectionView의 Inspect 요소에서 선택하십시오 .


2

나는 똑같은 문제가 있었고 아무것도 고칠 수 없었습니다. Layout Delegate가 정의한 다른 기능에 가까워 졌기 때문에 비공개로 설정하라는 노란색 경고가 표시되었습니다. 나를 위해 고친 것은 다음과 같습니다.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize

"sizeForItemAtIndexPath"와 올바른 "sizeForItemAt"의 차이를 확인하십시오.

나는 이것을 알아 내려고 며칠 동안 내 머리카락을 찢었 고 마침내 효과가있었습니다. 아래에는 높이를 0으로 만들어 셀을 "숨긴"방법을 보여주는 모든 기능이 포함됩니다.

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])")
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width

    if (findIndex! % 2 == 0){
        // Even index, show cell
        return CGSize(width: screenWidth, height: 246)
    }
    else {
        return CGSize(width: screenWidth, height: 0)
    }
}

0

어젯밤에이 문제가 발생했습니다. 마지막으로 자정에 'didSelectItemAtIndex'메서드가 닫힘 괄호 "}"로 닫히지 않았 음을 깨달았을 때 문제를 해결했습니다.

컴파일 오류로 인해 클래스 맨 아래에 클로저 괄호를 추가했습니다. 따라서 사실상 'didSelectItemAtIndex'아래의 모든 메서드는 해당 메서드 안에있었습니다.

다른 사람이 이것에 저녁 4 시간을 낭비 할 경우를 대비하여 여기에 게시하십시오 :-(


0

이것을 viewDidLoad ()에 넣어야합니다.

collectionView.delegate = self

0

내 문제는 내 UICollectionViewDataSource 개체를 지역 변수로 생성했다는 것입니다. 따라서 코드에서 수동으로 dataSource 개체를 초기화하는 경우 전역 변수로 저장해야합니다.


0

이 방법 사용

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

}

대신에

private func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

}

0

추가 : UICollectionViewDelegateFlowLayout

class YourClass: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}

-11

나를 위해 (Swift 3.1에서) 메서드는 다음과 같이 public으로 선언되어야합니다.

    public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       return CGSize()
    }

공개 하는 것을 잊지 마십시오 .


public프레임 워크와 모듈간에 코드에 액세스 할 수 있도록하는 데 사용하는 것입니다.
ScottyBlades 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.