【问题标题】:Allow user interaction during performBatchUpdates在 performBatchUpdates 期间允许用户交互
【发布时间】:2019-12-28 17:11:55
【问题描述】:

我有一个集合视图,我修改了它的项目大小,我通过调用它的 performBatchUpdates 方法来应用更改。

这会导致使用漂亮的动画进行更改,事实是,它还会禁用所有用户与我的 collectionView 的交互,我希望仍然允许这样做。

我还尝试使用 .allowUserInteraction 选项将调用包装在 UIView.animate 块中,但没有成功。

func collectionView(_ collectionView: UICollectionView, didUpdateFocusIn context: UICollectionViewFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
     workItem?.cancel()
     workItem = DispatchWorkItem(block: {
        UIView.animate(withDuration: 0.2, delay: 0, options: [.curveEaseOut, .allowUserInteraction], animations: {
             self.collectionView.performBatchUpdates(nil, completion: nil)
         }, completion: nil)
    })

     DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.5, execute: workItem!)
}

有什么办法可以克服这个问题并允许在动画期间进行用户交互?

【问题讨论】:

  • 用户在动画中的集合视图上的交互听起来不连贯。你的真正目标是什么?
  • 我在 tvOS 上,我有一个集合视图,我希望它的项目在聚焦时改变大小,虽然我确实使用上面的代码(以及 sizeForItemAt 中的一些代码)实现了这个效果,但我不想在发生这种情况时阻止用户与应用程序交互,因此即使其中一个单元格正在改变它的大小,用户也可以继续滚动。

标签: ios swift uicollectionview uiviewanimation tvos


【解决方案1】:

如果 workItem 很重,您可以尝试将其移至后台线程。根据我的经验,在主线程上执行某些操作时更新/更改 UICollectionView 总是会冻结 UI。

你可以试试:

   DispatchQueue.global(qos: .background).async {
     workItem! 
    }

【讨论】:

  • 我不能这样做,因为workItem 正在触摸 GUI 元素,这只能通过 gui 线程实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多