컬렉션 뷰를로드하기 전에 사용자는 컬렉션 뷰 배열의 이미지 수를 설정합니다. 모든 셀이 화면에 맞지 않습니다. 30 개의 셀이 있고 화면에는 6 개만 있습니다.
질문 : UICollectionView로드시 원하는 이미지가있는 셀로 자동으로 스크롤하는 방법은 무엇입니까?
답변
viewWillAppear
컬렉션보기가 아직 레이아웃을 완료하지 않았기 때문에 스크롤이 안정적으로 작동하지 않을 수 있음을 발견 했습니다. 잘못된 항목으로 스크롤 할 수 있습니다.
또한 스크롤 viewDidAppear
을하면 스크롤되지 않은 뷰가 일시적으로 깜박이 는 것을 발견했습니다 .
그리고을 (를) 통해 매번 스크롤하면 viewDidLayoutSubviews
일부 컬렉션 레이아웃으로 인해 스크롤 할 때마다 하위보기 레이아웃이 발생하기 때문에 사용자가 수동으로 스크롤 할 수 없습니다.
내가 찾은 결과는 다음과 같습니다.
목표 C :
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// If we haven't done the initial scroll, do it once.
if (!self.initialScrollDone) {
self.initialScrollDone = YES;
[self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath
atScrollPosition:UICollectionViewScrollPositionRight animated:NO];
}
}
빠른 :
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
if (!self.initialScrollDone) {
self.initialScrollDone = true
self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
}
}
답변
새로 수정 된 답변 :
이것을 추가하십시오 viewDidLayoutSubviews
빠른
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let indexPath = IndexPath(item: 12, section: 0)
self.collectionView.scrollToItem(at: indexPath, at: [.centeredVertically, .centeredHorizontally], animated: true)
}
보통 .centerVertically
의 경우는
ObjC
-(void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:12 inSection:0];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically | UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}
이전 iOS에서 작동하는 이전 답변
이것을 추가하십시오 viewWillAppear
:
[self.view layoutIfNeeded];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
답변
위의 답변에 전적으로 동의합니다. 유일한 것은 솔루션이 viewDidAppear에 코드를 설정했다는 것입니다.
viewDidAppear
{
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
}
viewWillAppear를 사용했을 때 스크롤이 작동하지 않았습니다.
답변
이것은 나를 위해 작동하는 것처럼 보였으며 다른 답변과 비슷하지만 몇 가지 뚜렷한 차이점이 있습니다.
- (void)viewDidLayoutSubviews
{
[self.collectionView layoutIfNeeded];
NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
NSIndexPath *nextItem = [NSIndexPath indexPathForItem:someInt inSection:currentItem.section];
[self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
}
답변
빠른:
your_CollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)
스위프트 3
let indexPath = IndexPath(row: itemIndex, section: sectionIndex)
collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.right, animated: true)
스크롤 위치 :
UICollectionViewScrollPosition.CenteredHorizontally / UICollectionViewScrollPosition.CenteredVertically
답변
GCD를 사용하여 viewDidLoad의 다음 반복 메인 런 루프로 스크롤을 디스패치하여이 동작을 달성 할 수 있습니다. 컬렉션보기가 화면에 표시되기 전에 스크롤이 수행되므로 깜박이지 않습니다.
- (void)viewDidLoad {
dispatch_async (dispatch_get_main_queue (), ^{
NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
});
}
답변
나는 그것을하고 추천 할 것입니다 collectionView: willDisplay:
당신이 컬렉션 뷰 대리인이 뭔가를 제공하는 것을 확신 할 수 있습니다 그럼. 여기 내 예 :
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
/// this is done to set the index on start to 1 to have at index 0 the last image to have a infinity loop
if !didScrollToSecondIndex {
self.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
didScrollToSecondIndex = true
}
}