Programing

UICollectionView 레이아웃 문제

lottogame 2020. 12. 4. 07:42
반응형

UICollectionView 레이아웃 문제


UICollectionView흐름 레이아웃 사용하고 있습니다. 나는 같은 것을위한 관습 UICollectionViewCell만들었다 . 그러나 프로젝트를 실행하면 콘솔이 계속해서이 오류를 던집니다.

The behavior of the UICollectionViewFlowLayout is not defined because:
 the item height must be less that the height of the UICollectionView minus the section insets top and bottom values.

셀의 크기가 정확한지 확인했습니다.

누구든지이 문제를 해결할 수 있었습니까?


를 사용하여 storyboards으로 이동 storyboard하여 전체 View Controller(보기가 파란색으로 강조 표시되어야 함)를 클릭하고 Attributes Inspector(화면 오른쪽의 네 번째 탭 )으로 이동 하여 "Under Top Bars"를 선택 취소해야한다는 것을 발견했습니다. , "Under Bottom Bars"및 "Under Opaque Bars". 이것은 나를 위해 문제를 해결했고 동료들에게도 해결되었습니다.


컬렉션보기를 사용하여 전체 화면보기 컨트롤러를 표시 할 때 몇 가지 문제가 발생했습니다.

기본적으로 런타임에 항목의 크기를 요청하고 단순히 컬렉션보기의 크기를 반환합니다.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return self.collectionView.frame.size;
}

나는 이것이 매우 늦은 대답이라는 것을 알고 있지만 나도 이것을 경험했습니다.

내보기 컨트롤러 내부의 그것을 부르 자 MyViewController 나는이 UICollectionView정의 사용되는 UICollectionViewCell의. .NET Framework 의 높이에 따라 항목 크기를 반환하는 collectionView : layout : sizeForItemAtIndexPath 메서드를 구현 하고 UICollectionView있습니다.

MyViewController 는 자동 레이아웃을 사용하여 스토리 보드에서 UIViewController.

세로 모드에서는 셀이 잘 보이지만 가로 모드에서는 그렇지 않습니다.

나는 무효화가 내 문제를 해결 UICollectionViewLayout내의 UICollectionView내부의 viewWillLayoutSubviews방법을.

- (void)viewWillLayoutSubviews {
    [self.myCollectionView.collectionViewLayout invalidateLayout];
}

이전에는 내부 레이아웃을 무효화하려고했지만 willAnimateRotationToInterfaceOrientation:duration작동하지 않았습니다. 그 이유는 아마도 모든 뷰의 크기가 아직 계산되지 않았기 때문에 자동 레이아웃이 마법을 마칠 때까지 기다려야합니다. 이 SO 스레드를 참조하십시오 .

Swift 4.0 업데이트 :

  override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.myCollectionView.collectionViewLayout.invalidateLayout()
  }

전체 화면 셀로 컬렉션 뷰를 만들려고 할 때이 문제가 몇 번 발생했습니다. 내 문제는 IB / Storyboard에서 4 "화면을 레이아웃하고 항목 크기로 320 * 568을 지정했지만 높이가 480 인 3.5"화면을 사용하여 시뮬레이터에서 실행하여 발생했습니다. 해결책은 항목 크기를 지정하는 것입니다. 다음과 같은 코드 :

UICollectionViewFlowLayout *layout = (id) self.collectionView.collectionViewLayout;
layout.itemSize = self.collectionView.frame.size;

이렇게하면 셀 크기가 런타임에 올바르게 설정됩니다.


스토리 보드와 자동 레이아웃을 사용하는 경우 이런 종류의 문제를 디버깅하는 것은 정말 어렵습니다.

iPhone에서 UICollectionViewCell 전체 화면을 표시하려고 할 때 비슷한 문제가 발생했습니다.

대부분의 시간 문제는

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)

또는 flowLayout.itemSize에서 직접.

하지만 ...

  1. ViewController를 선택하십시오.

보기 컨트롤러 선택

  1. 그런 다음 가장자리 확장 옵션을 선택 취소합니다.

가장자리 확장 옵션 비활성화

이제 자동 레이아웃 제약을 설정해보십시오.

행운을 빕니다.


내 문제가 해결되었습니다.

-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
return CGSizeMake(self.collectionView.frame.size.width, self.collectionView.frame.size.height - 70);
}

U는이 화면의 상단과 하단에서 패딩 값을 볼 수 있습니다.

여기에 이미지 설명 입력


UICollectionView 및 UICollectionviewcell에 대해 올바른 자동 크기 조정 마스크를 설정해야합니다. 이것은 iPhone 4 Simulator의 문제를 해결했습니다.


For me I am using AKPickerView inside of a custom UIView which was giving me a slew of warnings like the ones mentioned here. All I did to eliminate the warnings was to Un-Check the box called 'AutoResize Subviews' in the Attributes Inspector for my custom UIView. That silenced the warnings so hard, I thought my logger stopped working.

여기에 이미지 설명 입력


What caused this for me was that I was trying to set my cells to the size of the superview rather than the size of the UICollectionView. Simply replaced the superview frame with the UICollectionView frame.


I just ran into the same error message, but for me the issue was that when I received new data from the api and tried to refresh my collectionView, the method that called [collectionView reloadData] wasn't calling it on the main thread.

Hope this helps someone...


I have same issue

the behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values.

I solved this issue by checking the values in section Insets.And for fix cell size I have used below code.

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);
CGFloat cellWidth =  [[UIScreen mainScreen] bounds].size.width - 20;
CGFloat cellHeight = [[UIScreen mainScreen] bounds].size.height - 120;

return CGSizeMake(cellWidth, cellHeight);


}

If you're loading a collectionView via a container view + UICollectionViewController, you may have set a height constraint on the container view which is constraining the height of the collection view itself. In my case, I found the collectionView.contentSize was taller than the constraint I had set on my container view.

Obviously this is a bit of an edge case but just in case you have a similar setup, I figured I'd add this comment.


None of the above fixes did it for me. I fixed it with this

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{CGFloat currentWidth = collectionView.frame.size.width;
UIEdgeInsets sectionInset = [(UICollectionViewFlowLayout *)collectionView.collectionViewLayout sectionInset]; //here the sectionInsets are always = 0 because of a timing issue so you need to force set width of an item a few pixels less than the width of the collectionView.

CGFloat width = currentWidth - 10;
}

참고 URL : https://stackoverflow.com/questions/16013209/uicollectionview-layout-issue

반응형