如何阻止 SwiftUI 选取器对其可见区域之外的触摸做出反应?



我在视图中有一个选择器,我希望将其限制为定义的高度和宽度。 虽然下面的代码直观地完成了这一点,但选取器会响应其区域之外的点击操作 - 在某些情况下,响应点击附近的按钮,就像我点击将选取器滚动到其值的开头或结尾一样。 (按钮不响应点击;选取器响应。 但是,当点击靠近 - 但在 - 选择器之外时,也会发生这种情况,因为那里没有控制。

选取器似乎对上方、下方和侧面的触摸做出反应。 当视图足够大(全屏或 2/3 屏幕(时,效果变得不那么明显,但是当整个应用仅获得屏幕的 1/3,并且选取器的宽度(作为视图几何图形的函数(变小时,其他控件也靠得更近,并且变得非常难以使用。

如何使选取器忽略其可见区域之外的所有触摸?

Picker(selection: self.$monthSelector, label: Text("Month")) {
ForEach(0 ..< 12, id: .self) {
Text(self.monthNames()[$0])
.foregroundColor(  Color.black )
}
}
.labelsHidden()
// THE FOLLOWING 2 STATEMENTS *IN CONJUNCTION* SEEM TO GIVE DESIRED Height/Width
.fixedSize()
.frame(maxWidth: geometry.size.width * 0.35, maxHeight: 100)
.clipped()     // seems to accomplish nothing, visually or regarding touches
.background(Color.white)
.cornerRadius(10)

我考虑过的事情:

  • .clipped放在框架上(此处建议(。没有效果。
  • 这个问题不是SwiftUI,也没有我能确定的真正线索。
  • 此问题讨论扩展按钮可点击区域。看不到将关键见解("将修饰符应用于按钮的内容而不是按钮本身"(应用于选取器的方法 - 尤其是关于其高度。
  • 这个问题没有答案,我在选择器上看到的内容似乎远远超出了对该问题的评论似乎归因于的~15分的"误差幅度"。 此外,我在 Picker 上看到的情况发生在模拟器和实际设备中。

这是一个解决方案。使用 Xcode 11.4/iOS 13.4 进行测试。

.compositingGroup() // << add this modifier above clipping !!!
.clipped()

iOS 16- 我发现我有一些选择器在使用它们的默认外观(即"菜单"(时在预期的"点击区域"之外运行 一旦我指定了它应该是什么类型的选择器,例如"菜单",那么这就解决了我的问题。 选取器仅在您点击预期反应区域时激活。

.pickerStyle(.menu)

此链接介绍了一些旧的解决方法,但似乎没有适合iOS 15.1的解决方法。

不过,有一个如何让它工作的例子。他制作了一个可表示的视图结构。

iOS15 - SwiftUI WheelPicker 可滚动的外部框架和剪辑区域破坏其他界面

如果在剪裁之前应用.contentShape(Rectangle(((,它将限制对可见区域的触摸。

最新更新