>

UICollectionView에 UIPageControl이 포함 된 상황이 있습니다. 각 페이지에는 자체 지정된 페이지가 있으며,이를 컬렉션보기 셀로 분할했습니다. 두 번째 페이지를 쓸어 넘기면 페이지 컨트롤 표시기가 1로 유지되고 세 번째 페이지로 밀면 세 번째 표시기로 올바르게 업데이트됩니다. 2 페이지로 다시 스 와이프하면 페이지 컨트롤에 올바른 표시기가 표시됩니다. 매번 두 번째 페이지에서만 발생합니다.

여기 내 코드가 있습니다 :

컬렉션보기가있는 메인 컨트롤러

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cellId", forIndexPath: indexPath) as! ItemImageCell
    if let imageURL = self.featuredItem.itemImageNames {
        cell.itemImageURL = imageURL[indexPath.item]
        cell.pageControl.currentPage = indexPath.item
        cell.pageControl.numberOfPages = imageURL.count
    }
    return cell
}

cellView 클래스에서

let pageControl: UIPageControl = {
    let pageControl = UIPageControl()
    pageControl.pageIndicatorTintColor = UIColor.grayColor()
    pageControl.currentPageIndicatorTintColor = UIColor.blackColor()
    return pageControl
}()
override func setupViews() {
    backgroundColor = UIColor.whiteColor()
    addSubview(pageControl)
    addConstraint(NSLayoutConstraint(item: pageControl, attribute: .CenterX, relatedBy: .Equal, toItem: self, attribute: .CenterX, multiplier: 1, constant: 0))
}

제대로 설정하지 않았습니까?

수정 :

특집 아이템 모델 클래스 :

class FeaturedItem: NSObject {
    var itemImageNames: [String]?
    var itemTitle: String?
    var itemHighlight: String?
    var itemDescription: String?
    var itemURL: String?

}


  • 답변 # 1

    당신의 self.featuredItem.itemImageNames 이후  페이지 컨트롤이 올바르게 설정되지 않았을 수 있습니다. 데이터를 다시로드 한 후 컬렉션보기를 다시로드 할 수 있습니다

    그러나 데이터 소스 방법 cellForItemAtIndexPath  아마도 페이지 표시기를 업데이트하기에 좋지 않은 위치입니다. 컬렉션 뷰가 셀을 표시 할 필요는 없지만 컬렉션 뷰에 셀이 필요할 때 호출됩니다. 셀을 프리 페치하기 위해 사용자가 스크롤하기 전에 호출하거나 콜렉션 뷰에 이미 캐시 된 셀이있는 경우 사용자가 스크롤 할 때 호출되지 않을 수 있습니다 (예 : 빠른 왼쪽/오른쪽/왼쪽 스크롤).

    대리자 메소드 willDisplayCell:forItemAtIndexPath: 에서 페이지 표시기를 업데이트해야합니다.

    func collectionView(collectionView: UICollectionView,
            willDisplayCell cell: UICollectionViewCell,
            forItemAtIndexPath indexPath: NSIndexPath) {
            guard let myCell = cell as? ItemImageCell, 
                      imageURL = self.featuredItem.itemImageNames else {
                return
            }
            myCell.pageControl.currentPage = indexPath.item
            myCell.pageControl.numberOfPages = imageURL.count
    }
    
    

  • 답변 # 2

    이 다른 게시물에서 내 문제에 대한 해결책을 찾을 수있었습니다.

    UIPageControl에서 currentPage 표시기가 업데이트되지 않은 이유는 무엇입니까?

    구체적으로 Paulw11의 솔루션 제안을 사용하여 cellForItemAtIndexPath의 현재 구현을 다음과 같이 변경했습니다.

    func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
        guard let myCell = cell as? ItemImageCell, imageURL = self.featuredItem.itemImageNames else {
            return
        }
        myCell.pageControl.numberOfPages = imageURL.count
        myCell.pageControl.currentPage = indexPath.item
    }
    
    

    현재 page 변수를 설정하기 전에 numberOfPages 변수를 설정하십시오.

  • 답변 # 3

    실제로 해결책은 매우 간단합니다. numberOfPages를 먼저 할당 한 다음 currentPage를 할당해야합니다.

    그러므로 뒤집으세요.

  • 이전 가라테 기능 파일에서 Cassandra를 통합하여 테스트 데이터를 삭제하는 방법
  • 다음 angular - 배열의 Observable에서 각 항목을 비동기 적으로 수정하고 수정 된 Observable을 반환