2013-08-23 2 views
1

셀의 세로 목록을 표시하는 UICollectionView가 있습니다. 그것은 기본적으로 tableview지만 각 셀이 뷰에 배치되는 방식에 대한 더 많은 컨트롤러를 위해 콜렉션 뷰를 사용하고 있습니다. 어떤 이유로 컬렉션보기의 마지막 셀이 잘립니다. 아래쪽 절반을 위로 드래그하여 볼 수는 있지만 콜렉션 뷰를 놓아 버리 자마자 마지막 셀의 아래쪽 절반이 가려져 제자리로 되돌아옵니다. 나는 collectionview를 포함하는 xib를 가지고 있고, 다른 xib의 collection view 셀들을 등록한다. 이 전체보기는 프로그래밍 방식으로 탐색 컨트롤러에 배치됩니다. 내 생각은 자동 레이아웃 문제입니다. 콜렉션 뷰를 포함하는 뷰 컨트롤러를 프로그래밍 방식으로 탐색 컨트롤러에 추가하기 때문에 콜렉션 뷰와 탐색 바 사이에 제약 조건이 설정되지 않습니다. 인스턴스화 된 탐색 모음을 숨기고 IB에서 끌어서 놓기 만하면 콜렉션 뷰 셀이 잘리지 않습니다. 그러나 나는 이런 식으로하고 싶지 않다. 프로그래밍 방식으로 제약 조건을 추가하려고했지만 그 중 하나가 작동하지 않습니다. 누구든지 어떤 제안이 있습니까? 다음은 탐색 컨트롤러를 만들고 콜렉션 뷰가 포함 된보기 컨트롤러를 배치하는 방법입니다. 또한 제약 조건을 추가하는 데 사용하려고 시도한 코드가 포함되어 있습니다. 당분간, 나는 didFinishLaunchingWithOptions에서 응용 프로그램의 위임에이 일을 해요 : 난 그냥 비슷한 문제로 실행UICollectionView의 마지막 셀이 잘립니다.

self.homeViewController = [[FFHomeViewController alloc] init]; 
FFNavigationPanelViewController *navigationController = [[FFNavigationPanelViewController alloc] init]; 
UINavigationController *frontNavigationController = [[UINavigationController alloc] initWithRootViewController:self.homeViewController]; 
// frontNavigationController.navigationBarHidden = YES; 
UINavigationController *rearNavigationController = [[UINavigationController alloc] initWithRootViewController:navigationController]; 


NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:self.homeViewController.collectionView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.homeViewController.navigationController.navigationBar attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0]; 

[self.viewController.frontViewController.view addConstraint:topConstraint]; 

답변

0

. 문제는 UICollectionView가 UIScrollView의 하위 클래스이며 콘텐츠에 할당 된 공간의 양이 실제 셀 수에 맞게 업데이트되지 않는다는 사실에서 기인합니다.

단일 항목 열이있는 경우 UICollectionView의 contentSize를 설정하여 UICollectionViewCell을 모두 가상적으로 표시하는 데 필요한 공간을 일치시켜야합니다.

가정 당신의 세포가 100 픽셀 높은 당신은 하나 개의 섹션이, 내가보기 컨트롤러에 ViewWillAppear에 다음과 같이 뭔가를 추가 :

int itemCount = [self.collectionView numberOfItemsInSection:0]; 
float contentHeight = (100*itemCount)+100; 
CGRect screenFrame = [[UIScreen mainScreen]bounds]; 
self.collectionView.contentSize = CGSizeMake(screenFrame.size.width, frameHeight); 

추가 (100)를 추가 약간의 빈 공간에서 가능 끝까지 스크롤하면 아래쪽으로 이동합니다.

사이드 노트 : 여기에 이상한 버그가있을 수 있습니다. 이 계산을 viewWillLoad | viewWillAppear | viewDidAppear 중 하나에 넣을 때 효과가있는 것 같지 않지만 이상하게도 numberOfItemsInSection에 넣습니다. 입니다. 그건 정말 적절한 장소가 아니지만 xib 프로그래밍 방식으로 생성보다는 collectionView로드의 부작용이있을 수 있습니다.

그리고 최종 후속 조치 : contentSize 코드를 viewWillLayoutSubviews에 두는 것이 적절한 동작을하는 것으로 보입니다.

0

비슷한 문제가있어서 가로 세로 collectionView 한 줄로 여러 곳에서 사용하고 있습니다. 하나의 ViewController collectionView은 마지막 셀의 절반을 클리핑하여 해당 셀을 클릭 할 수 없었습니다.

sectionInsetcollectionView으로 설정하면 쉽게 해결할 수 있습니다.

collectionView가 ViewController에있는 경우이 코드를 viewDidLoad()에 넣거나 xib에있는 경우 init 메서드에이 코드를 입력하면됩니다. collectionView.contentSize에 빈 공간이없는 내 경우

if let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout { 
    flowLayout.sectionInset.right = flowLayout.itemSize.width/2 
} 

은 셀 너비의 절반과 거의 동일했지만, 당신은 당신이 원하는대로로 설정할 수 있습니다.

가로 스크롤시 collectionView의 경우에만 .bottom 속성을 사용하여 셀을 가로 스크롤하기 때문에 .right 속성을 사용했습니다.

매우 좋지 않지만 적어도 작동합니다.