iOS 13 分段控件:删除滑动手势以选择分段



TLDR:如何在iOS 13上删除UISegmentedControl的滑动/平移手势识别器?

嗨,在 iOS 13 上,UI EgmentedControl 发生了很多变化。大多数情况下,这些变化是基于外观的。但是还有另一个功能更改弄乱了我的应用程序。

在 iOS 13 上,使用 UISegmentedControls,您现在除了触摸要选择的片段外,还可以滑动/平移以更改所选片段。

在我的应用程序中,我基本上在滚动视图中嵌入了一个UISegmentedControl。UISegmentedControl 太长,屏幕无法显示所有值,因此我创建了一个滚动视图,该视图是屏幕宽度,其内容宽度是 UISegmentedControl 的长度,要访问不可见的段,用户滑动"滚动视图"和分段控件幻灯片。

这在 iOS 13 之前一直完美运行,现在,用户在拖动分段控件时无法滚动水平背景滚动视图,因为我假设滚动视图滚动识别器被新的滚动视图滑动以选择手势覆盖。

我甚至尝试递归删除 UISegmentedControl 及其所有子视图的所有手势识别器,并且滑动以更改选择手势仍然有效......我被困住了。

谢谢,如果问题不清楚,请告诉我

我有一个类似的设置(UISegmentedControlUIScrollViewbc 里面太长了,客户不想压缩内容以适应(。这对我有用(基于 Xcode 11.1 构建(:

class NoSwipeSegmentedControl: UISegmentedControl {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
}

然后将我UISegmentedControl的类设置为该类。在我的应用程序中,这只会阻止在嵌入UIScrollView中的UISegmentedControl对象上滑动选择手势。如果它不在UIScrollView则没有任何不同。这是有道理的,因为默认情况下gestureRecognizerShouldBegin()返回true。那么为什么这允许UIScrollView优先使用滑动手势,我不知道。但希望它有帮助。

我升级了@Aystub的答案。您只能允许 UITapGestureRecogniger 选择区段。

class NoSwipeSegmentedControl: UISegmentedControl {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if(gestureRecognizer.isKind(of: UITapGestureRecognizer.self)){
return false
}else{
return true
}
}
}

使用此代码允许仍滑动分段控件,除非它嵌入在UIScrollView中。在我看来,这是功能上最小的权衡

final class NoSwipeSegmentedControl: UISegmentedControl {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
guard type(of: gestureRecognizer).description() != "UIScrollViewPanGestureRecognizer" else {
return true
}
return super.gestureRecognizerShouldBegin(gestureRecognizer)
}
}

最新更新