ScrollToItem不起作用

时间:2018-06-20 11:13:42

标签: ios swift database scroll uicollectionview

为什么scrollToItem在我的CollectionView中不起作用?我要在EnabledID上使用scrollToItem。那么有什么问题以及如何解决?

代码:

var dataArray = NSMutableArray() // dataArray is has a data from Database
var EnabledID = Int()

EnabledID = UserDefaults.standard.integer(forKey: "EnabledID")

if EnabledID == 0 {

    EnabledID = 1
    UserDefaults.standard.set(1, forKey: "EnabledID")

} else {
    if EnabledID < dataArray.count {
        let index = NSIndexPath(item: EnabledID, section: 0)
        self.myCollectionView.scrollToItem(at: index as IndexPath, at: .centeredVertically, animated: true)
    }
}

10 个答案:

答案 0 :(得分:13)

我发现做到这一点的最好方法是不使用scrollToItem而是获取索引的CGRect,然后使其可见。

 let rect = self.collectionView.layoutAttributesForItem(at: IndexPath(row: 5, section: 0))?.frame
 self.collectionView.scrollRectToVisible(rect!, animated: false)

答案 1 :(得分:3)

尝试此代码...

[collectionView setDelegate:self];
[collectionView reloadData];
[collectionView layoutIfNeeded];
[collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionTop animated:YES];

Swift-4.x

collectionView.delegate = self
collectionView.reloadData()
collectionView.layoutIfNeeded()
collectionView.scrollToItem(at: IndexPath(item: 0, section: 0), at: .top, animated: true)

滚动方向为水平时,您需要使用向左向右居中水平

顶部是垂直方向。

collectionView.scrollToItem(at: index, at: .top, animated: true)

答案 2 :(得分:1)

它将不起作用,因为contentSize可能是(0,0)。 如果您不希望使用layoutIfNeeded(),因为您可能在其中执行了不必要的不​​必要的工作,则应该自己计算(假设已加载数据,并且视图进行了布局)。

Swift 5.2

    collection.contentSize = CGSize(width: collection.bounds.width * CGFloat(items.count), height: collection.bounds.height)
    collection.scrollToItem(at: IndexPath(row: startingIndex, section: 0), at: .left, animated: false)

答案 3 :(得分:1)

试试这个。它对我有用

func scrollToIndex(index:Int) {
     let rect = self.collectionView.layoutAttributesForItem(at:IndexPath(row: index, section: 0))?.frame
     self.collectionView.scrollRectToVisible(rect!, animated: true)
 }

答案 4 :(得分:0)

尝试

var dataArray = NSMutableArray() // dataArray is has a data from Database
var EnabledID = Int()
EnabledID = UserDefaults.standard.integer(forKey: "EnabledID")

if EnabledID == 0 {

    EnabledID = 1
    UserDefaults.standard.set(1, forKey: "EnabledID")

} else {
If EnabledID < dataArray.count{

        let indexPath = IndexPath(item: EnabledID, section: 0)

        if let cell  = self.myCollectionView.cellForItem(at: indexPath) as? CollectionViewCell {

        } else {
            print("not able to cast collection view cell class to `CollectionViewCell` ")
        }
    }
}

答案 5 :(得分:0)

尝试水平收集视图

var isViewDidLayoutCallFirstTime = true


override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    guard self.isViewDidLayoutCallFirstTime else {return}
    self.isViewDidLayoutCallFirstTime = false
    self.collectionView.collectionViewLayout.collectionViewContentSize // It will required to re calculate collectionViewContentSize in internal method 
    let indexpath = IndexPath(item: self.currentIndex, section: 0)

    self.collectionView.scrollToItem(at: indexpath, at: UICollectionViewScrollPosition.centeredHorizontally, animated: false)

}

答案 6 :(得分:0)

我的问题有点奇怪。我的iPhone 6/7/8可以正常工作,但iPhone X或11无法滚动到我的预期位置。 我的原始代码是:

collectionView.reloadData()
collectionView.scrollToItem(at: IndexPath(item: 10, section: 0), at: .top, animated: true)

添加collectionView.layoutIfNeeded()之后。问题可以在我的iPhone X和11上解决。

collectionView.reloadData()
collectionView.layoutIfNeeded()
collectionView.scrollToItem(at: IndexPath(item: 10, section: 0), at: .top, animated: true)

此答案受@ram启发。他应该得到荣誉。添加此答案只是为了强调不同iPhone之间的区别。这样人们可以更快地搜索答案。

答案 7 :(得分:0)

在我的情况下.centeredVertically没有任何效果,并且悄然失败了。 .centeredHorizo​​ntally修复了它

答案 8 :(得分:0)

我在iOS 14.x和Xcode 12.x上遇到了这个问题。

最适合我的解决方案是使用:

collectionView.scrollRectToVisible(rect, animated: true)

答案 9 :(得分:0)

 var scrollImg: Int = 0

override func viewDidLoad() {
    super.viewDidLoad()
    _ = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(autoScroll), userInfo: nil, repeats: true)

}

   @objc func autoScroll() {
    
    let totalCount = imageArray.count-1
    
    if scrollImg == totalCount{
        scrollImg = 0
    }else {
        scrollImg += 1
    }
    
    DispatchQueue.main.async {
        let rect = self.listOfViewsCollectionViews.layoutAttributesForItem(at: IndexPath(row: self.scrollImg, section: 0))?.frame
        if self.scrollImg == 0{
            self.listOfViewsCollectionViews.scrollRectToVisible(rect!, animated: false)
        }else {
            self.listOfViewsCollectionViews.scrollRectToVisible(rect!, animated: true)
        }
    }
}