gpt4 book ai didi

swift - 将 collectionview 中的事件单元格保存在一个地方

转载 作者:行者123 更新时间:2023-11-28 10:12:38 25 4
gpt4 key购买 nike

我正在开发一个 tvOS 应用程序,我希望 collectionView 的事件单元格始终处于同一位置。换句话说,我不希望事件单元格通过我的 collectionView,但我希望 collectionView 通过我的事件单元格。

下图中的示例。事件标签始终位于屏幕中央,而您可以滚动 collectionView 以在那边获得不同的事件标签。

基本上是一个带有自定义 UI 的 pickerview。但遗憾的是iOS的pickerview并没有在tvOS上提供...

Active Cell

我已经研究过 UICollectionViewScrollPosition.verticallyCentered。这部分让我到达那里,但这还不够。如果我滚动得非常快,事件项目会跳到列表的下方,当我暂停时,它会一直向上滚动到中心。我真的希望事件项目始终位于屏幕中央。

关于如何做到这一点有什么想法吗?


根据@HMHero 的回答更新

好吧,我试着按照你告诉我的去做,但无法让滚动正常工作。这可能是由于我计算了偏移量,或者因为(如您所说)setContentOffset(, animated:) 不起作用。

现在我做了以下操作,但不确定从这里到哪里去;

禁用滚动并将最后一个和第一个标签居中

override func viewDidLoad() {
super.viewDidLoad()
//Disable scrolling
self.collectionView.isScrollEnabled = false
//Place the first and last label in the middle of the screen
self.countryCollectionView.contentInset.top = collectionView.frame.height * 0.5 - 45
self.countryCollectionView.contentInset.bottom = collectionView.frame.height * 0.5 - 45
}

获取标签的位置以检索距屏幕中心的距离(偏移量)

func collectionView(_ collectionView: UICollectionView, didUpdateFocusIn context: UICollectionViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
if let indexPath = context.nextFocusedIndexPath,
let cell = countryCollectionView.cellForItem(at: indexPath) {
//Get the center of the next focused cell, and convert that to position in the visible part of the (tv) screen itself
let cellCenter = countryCollectionView.convert(cell.center, to: countryCollectionView.superview)
//Get the center of the collectionView
let centerView = countryCollectionView.frame.midY
//Calculate how far the next focused cell y position is from the centerview. (Offset)
let offset = cellCenter.y - centerView
}
}

偏移量在打印时返回增量 100。标签的高度为 90,间距为 10。所以我认为这是正确的,尽管它一直运行到 2400(最后一个标签)。

关于从这里去哪里有什么想法吗?

最佳答案

我在 tvOS 上工作已经一年多了,但我记得它应该相当简单,只需一个简单的技巧。使用更新的 api 可能有更好的方法来执行此操作,但这就是我所做的。

1) 禁止在 Collection View 上滚动 isScrollEnabled = false

2) 在委托(delegate)中,可选的 public func collectionView(_ collectionView: UICollectionView, didUpdateFocusIn context: UICollectionViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator), 获取 nextFocusedIndexPath 并计算单元格的偏移量以使其位于 Collection View 的中心。

3) 使用偏移量,在委托(delegate)回调中手动设置滚动动画。

我找到了我有想法的旧帖子。

How to center UICollectionViewCell that was focused?

我最终做的与线程中的答案有些不同,但这是一个很好的提示。

关于swift - 将 collectionview 中的事件单元格保存在一个地方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45745267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com