[ios] UICollectionView는 IndexPath에서 셀로 자동 스크롤

컬렉션 뷰를로드하기 전에 사용자는 컬렉션 뷰 배열의 이미지 수를 설정합니다. 모든 셀이 화면에 맞지 않습니다. 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
    }
}