컬렉션 뷰를로드하기 전에 사용자는 컬렉션 뷰 배열의 이미지 수를 설정합니다. 모든 셀이 화면에 맞지 않습니다. 30 개의 셀이 있고 화면에는 6 개만 있습니다.
질문 : UICollectionView로드시 원하는 이미지가있는 셀로 자동으로 스크롤하는 방법은 무엇입니까?
컬렉션 뷰를로드하기 전에 사용자는 컬렉션 뷰 배열의 이미지 수를 설정합니다. 모든 셀이 화면에 맞지 않습니다. 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)
}
}
[self.collectionView layoutIfNeeded];
이전 에 전화 해야했는데 viewDidLoad
.
새로 수정 된 답변 :
이것을 추가하십시오 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];
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
위의 답변에 전적으로 동의합니다. 유일한 것은 솔루션이 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
}
}
여기에 모든 답변-해킹. relaodData :
서브 클래스 컬렉션 뷰 레이아웃 을 사용한 후 어딘가에서 컬렉션 뷰를 스크롤하는 더 좋은 방법을 찾았습니다. 어떤 레이아웃을 사용하든 prepareLayout 메서드를 재정의하고, 슈퍼 호출 후 필요한 오프셋을 설정했습니다.
예 : https://stackoverflow.com/a/34192787/1400119
initialScrollDone
이 메서드는 두 번 이상 호출되고 scrollToItemAtIndexPath를 호출하면 LenK가 한 것처럼 플래그를 사용하는 것을 강조 하겠습니다. scrollToItemAtIndexPath : 두 번 이상 collectionView를 스크롤 할 수 없게 렌더링하는 것 같습니다 (iOS 시뮬레이터 iPhone 5 / iOS 8)