iOS 13分段控件:删除滑动手势以选择分段
TLDR:如何在iOS 13上删除UISegmentedControl的滑动/平移手势识别器 您好,在iOS 13上,使用UISegmentedControl更改了很多内容。大多数情况下,这些变化是基于外观的。但还有另一个功能上的改变,它把我的应用搞得一团糟 在iOS 13上,使用UISegmentedControls,您现在可以滑动/平移以更改选定的段,此外还可以触摸要选择的段 在我的应用程序中,我基本上在scrollview中嵌入了一个UISegmentedControl。UISegmentedControl太长,屏幕无法显示所有值,因此我创建了一个scrollview,它是屏幕的宽度,其内容宽度是UISegmentedControl的长度,要访问不可见的片段,用户可以滑动“scrollview”和分段控件幻灯片 在iOS 13之前,这项功能一直运行良好,现在,用户在分段控件上拖动时无法滚动水平背景scrollview,因为我假设scrollview滚动识别器被新的scrollview滑动选择手势覆盖 我甚至尝试过递归地删除UISegmentedControl及其所有子视图的所有手势识别器,滑动以更改选择手势仍然有效。。。我被卡住了 谢谢,如果问题不清楚,请告诉我。我有类似的设置(iOS 13分段控件:删除滑动手势以选择分段,ios,swift,uisegmentedcontrol,ios13,Ios,Swift,Uisegmentedcontrol,Ios13,TLDR:如何在iOS 13上删除UISegmentedControl的滑动/平移手势识别器 您好,在iOS 13上,使用UISegmentedControl更改了很多内容。大多数情况下,这些变化是基于外观的。但还有另一个功能上的改变,它把我的应用搞得一团糟 在iOS 13上,使用UISegmentedControls,您现在可以滑动/平移以更改选定的段,此外还可以触摸要选择的段 在我的应用程序中,我基本上在scrollview中嵌入了一个UISegmentedControl。UISegment
UISegmentedControl
在UIScrollView
bc中,太长了,客户端不想压缩内容以适应需要)。这对我很有用(基于Xcode 11.1构建):
然后将my
UISegmentedControl
的类设置为该类。在我的应用程序中,这仅防止在UISectionedControl
嵌入UIScrollView
的对象上滑动选择手势。如果它不在UIScrollView
。这很有意义,因为默认情况下,gestureRecognitizerShouldBegin()
返回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
中。在我看来,这是功能上最小的折衷
最终类NosweepSegmentedControl:UISegmentedControl{
覆盖函数GestureRecognitzerShouldBegin(\uGestureRecognitzer:UIGestureRecognitzer)->Bool{
防护类型(属于:手势识别器)。说明()!=“UISCROLLVIEWPANGESTURE识别器”其他{
返回真值
}
返回super.gestureRecognitizerShouldBegin(gestureRecognitizer)
}
}
我根本没有研究过这一点,但由于您没有找到手势,可能没有使用任何手势,并且它是通过UIResponder
中常用的touchesXXX
方法实现的。您可以创建子类UISegmentedControl
并尝试覆盖touchesMoved
。看看这是否能让你有所收获。这个简单而优雅的解决方案非常有效。问题解决了。应该有更好的文档记录每次iOS更新对系统UI元素功能的更改。甚至更好的是,像这样影响元素行为的属性应该能够在初始化期间或使用实例变量进行调整。非常感谢!答案是,通过覆盖手势识别器ShouldBegin,您允许滚动视图的平移手势识别器开始跟踪,这超越了分段控件的触摸处理。如果您调用super.gestureRecognitizerShouldBegin(gestureRecognitizer)
,您实际上可以看到它返回false
(UISegmentedControl拒绝接收到的手势)。此解决方案解决了UISegmentedControl上的刷卡问题,但它使片段难以选择。我是唯一受折磨的人吗?
class NoSwipeSegmentedControl: UISegmentedControl {
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
if(gestureRecognizer.isKind(of: UITapGestureRecognizer.self)){
return false
}else{
return true
}
}
}