iOS: 允许用户交互但禁止在滚动时选择 UICollectionView 中的其他单元格
iOS: Allow user interaction but disable selection of other cells in UICollectionView when scrolling
我已经使用集合视图实现了水平菜单。在我选择了一个单元格并滚动 collectionView 的情况下,我希望其他单元格在滚动结束之前不可选,同时保持先前选择的单元格的选择状态。简单地设置 allowsSelection = false
将取消选择先前选择的单元格。我已经实现了以下方法来检测滚动是否完成:
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
if collectionView.isScrollEnabled {
isDragging = true
collectionView.isUserInteractionEnabled = false
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate {
collectionView.isUserInteractionEnabled = true
}
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
collectionView.isUserInteractionEnabled = true
}
但是,设置isUserInteractionEnabled = false
意味着我不能在快速滑动的情况下手动提前停止滚动,这是不希望的。我怎样才能做到这一点?谢谢你。感谢任何帮助。
解法:
无需 enabling/disabling 用户交互即可实现此目的。
使isDragging
成为全局变量。
var isDragging: Bool = false
对 UIScrollViewDelegate
方法进行以下更改:
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
self.isDragging = true
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate {
self.isDragging = true
}
else {
self.isDragging = false
}
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
self.isDragging = false
}
将以下逻辑添加到 UICollectionViewDelegate
的 didSelectItemAt
方法:
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if !self.isDragging {
// Your code related to cell selction here.
}
}
我已经使用集合视图实现了水平菜单。在我选择了一个单元格并滚动 collectionView 的情况下,我希望其他单元格在滚动结束之前不可选,同时保持先前选择的单元格的选择状态。简单地设置 allowsSelection = false
将取消选择先前选择的单元格。我已经实现了以下方法来检测滚动是否完成:
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
if collectionView.isScrollEnabled {
isDragging = true
collectionView.isUserInteractionEnabled = false
}
}
func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
if !decelerate {
collectionView.isUserInteractionEnabled = true
}
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
collectionView.isUserInteractionEnabled = true
}
但是,设置isUserInteractionEnabled = false
意味着我不能在快速滑动的情况下手动提前停止滚动,这是不希望的。我怎样才能做到这一点?谢谢你。感谢任何帮助。
解法:
无需 enabling/disabling 用户交互即可实现此目的。
使
isDragging
成为全局变量。var isDragging: Bool = false
对
UIScrollViewDelegate
方法进行以下更改:func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { self.isDragging = true } func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { if !decelerate { self.isDragging = true } else { self.isDragging = false } } func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { self.isDragging = false }
将以下逻辑添加到
UICollectionViewDelegate
的didSelectItemAt
方法:func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if !self.isDragging { // Your code related to cell selction here. } }