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

Con*_*ers 2 picker swiftui

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

选择器似乎对上方、下方和侧面的触摸都有反应。当视图足够大(全屏或 2/3 屏幕)时,效果变得不那么明显,但是当整个应用程序只获得屏幕的 1/3 以及选择器的宽度时——作为视图的函数几何体——变小,其他控件也靠得更近,使用起来变得非常困难。

如何让 Picker 忽略其可见区域之外的所有触摸?

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)
Run Code Online (Sandbox Code Playgroud)

我考虑过的事情:

  • 戴上.clipped镜框(此处建议)。没有效果。
  • 这个问题不是 SwiftUI,我无法确定它的真正线索。
  • 本问题讨论扩展按钮的可点击区域。看不到将关键洞察力(“将修饰符应用于按钮的内容而不是按钮本身”)应用于 Picker 的方法——尤其是关于它的高度。
  • 这个问题没有答案,我在选择器上看到的似乎远远超出了对该问题的评论似乎归因于大约 15 分的“误差幅度”。此外,我在 Picker 中看到的内容同时发生在模拟器和实际设备中。

Asp*_*eri 5

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

.compositingGroup() // << add this modifier above clipping !!!
.clipped()
Run Code Online (Sandbox Code Playgroud)

  • 您能解释一下 compositingGroup() 在这里做什么吗? (2认同)

小智 5

iOS 16 - 我发现当我使用默认外观“菜单”时,有一些选择器在预期的“点击区域”之外运行,一旦我指定了它应该是什么类型的选择器,例如“菜单',然后这解决了我的问题。仅当您点击预期反应区域时,选择器才会激活。

.pickerStyle(.menu)
Run Code Online (Sandbox Code Playgroud)