3

컬렉션보기를 애니메이션없이 일부 오프 스크린 셀로 스크롤하고 스크롤 한 후 해당 셀의 위치를 ​​가져 오려고합니다. 문제는 콜렉션 뷰가 올바르게 (시각적으로) 스크롤되지만 셀 프레임은 화면 밖으로 유지된다는 것입니다. 여기 내 코드는 다음과 같습니다.UICollectionView scrollToItemAtIndexPath : 새 셀 위치 가져 오기

NSIndexPath *path = [fetchedResultsController indexPathForObject:objectInCollection]; 
[collectionView scrollToItemAtIndexPath:path atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO]; 
[collectionView layoutSubviews]; // or 'layoutIfNeeded', doesn't matter 
UICollectionViewCell *cell = [collectionView cellForItemAtIndexPath:path]; 
cellFrame = [cell.superview convertRect:cell.frame toView:nil]; // still not refreshed 

컬렉션보기에서 즉시 스크롤이 적용되지 않도록 제안 할 수 있으므로 스크롤 적용 방법을 찾고 싶습니다.

--- UPDATE ---

컬렉션보기 이전보기 컨트롤러에있는 (그래서 코드에서 스크롤 한 후 볼 뷰 컨트롤러를 팝업).

이전 뷰 컨트롤러의 viewDidAppear: 메서드에서도 셀 프레임이 오프 스크린으로 유지됩니다. 정확하게 말하자면, [cell.superview convertRect:cell.frame toView:nil];은 컬렉션보기의 contentOffset없이 프레임을 반환합니다. 따라서 CGRectOffset([cell.superview convertRect:cell.frame toView:nil], 0, -collectionView.contentOffset.y)은 화면에 올바른 셀 프레임을 반환합니다.

+0

정확하게 문제를 이해했는지 모르겠지만 스크롤 한 후에도 동일한 프레임을 가져야합니다. 스크롤하면 하위보기의 프레임이 변경되지 않습니다. contentOffset 만 변경해야합니다. 또는 UICollectionView의 수퍼 뷰 좌표에서 프레임을 가져 오려고합니까? –

답변

3

, 당신은 눈에 보이는 상태로보기에서있는 일부 셀을 설정하려면 . UICollectionView가

  • (공극) prepareLayout
  • (공극) layoutAttributes .. 방법을 계산할 때

    세포를 동일한 위치에 배치된다.

컬렉션 셀의 프레임은 invalidateLayout 또는 reloaddata가 호출 될 때까지 고정됩니다. 콜렉션 뷰의 contentOffset으로 해결해야합니다. 셀의 프레임을 가져 와서 contentOffset을 설정하면 셀의 프레임이 화면에 표시됩니다. 희망이 도움이됩니다.

+0

감사합니다, Pavan. 사실, 우리는 화면 위치를 얻으려면 셀 프레임에'contentOffset'를 추가해야합니다.이 경우는 일반적인 접근 방법과 다릅니다. [cell.superview convertRect : cell.frame toView : nil]; ' – brigadir

+0

당신의 환영합니다. 당신의 방법은 화면 프레임의 바깥쪽에 놓일 프레임이있는 셀의 터치 점을 가져올 때 사용됩니다.이 방법은 셀에 슈퍼 뷰 시점의 프레임이있는 것처럼 프레임을 제공합니다. –

0

셀 프레임이 정확해야하며 convertRect를 전혀 사용할 필요가 없다고 생각합니다.

cellFrame = cell.frame;

그러나 컬렉션보기를로드 한 후에이 작업을 수행해야 할 수 있습니다. 먼저 [collectionView reloadData]를 호출하십시오.

해당 셀의 특성을 가진 layoutAttributesForItemAtIndexPath: 메서드가 있습니다. indexPath에서 이것을 호출하고 그런 식으로 속성을 가져올 수 있습니다.

+0

GregP,'layoutAttributesForItemAtIndexPath :'에 대한 팁을 가져 주셔서 감사합니다. 불행히도'scrollToItemAtIndexPath'를 호출하기 전에'cell.frame'을 호출하고'reloadData'를 호출하더라도 문제는 해결되지 않습니다. – brigadir

+0

문제 없습니다. 미안해, 도움이되지 않았어. 다른 옵션이 있는지 확실하지 않습니다. – GregP

0

하는 UICollectionViewScrollPositionBottom에 스크롤 위치를 변경해보십시오, 이것은 나를 위해 작동 - 내가 문제 문에서 이해할 수 있듯이

[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionBottom animated:NO]; 
+0

불행히도, 이것은 도움이되지 않습니다 ... – brigadir

+0

왜 downvoted입니까?: – Atul

+0

내 downvote – brigadir