表单内堆栈内的按钮在边界外处于活动状态

Posted

技术标签:

【中文标题】表单内堆栈内的按钮在边界外处于活动状态【英文标题】:Button within stack within form is active outside of bounds 【发布时间】:2019-11-05 15:37:50 【问题描述】:

我在 SwiftUI 中有一些我不理解的奇怪行为,我将其简化为:


struct ContentView: View 
  @State var name: String = ""

  var body: some View 
    Form 
      VStack 
        Text("Line 1")
        Text("Line 2")
        Text("Line 3")
        Text("Line 4")
        Button(action: 
            print("hello world")
        )  Text("Print hello world")
      
    
  

这使得“第 1 行”...“第 4 行”文本成为“打印你好世界”按钮的一部分。

如果我删除表单中的 VStack,它们不会。

我不确定这是否是 SwiftUI 中的错误,或者我不理解一些我应该尝试理解的东西,所以:有人理解为什么第 1 行...第 4 行会成为此处按钮的一部分吗?

【问题讨论】:

他们想要做的是,当您在表单中放置一个按钮时,您可以通过点击该按钮所在行中的任意位置来激活该按钮。但当然,在你的情况下,这是不可取的!我还不知道解决方法... @cbjeukendrup 一种解决方法是使用 `.onTapGesture // you action 并忽略按钮的操作 【参考方案1】:

这不是错误,Form 在底层是 List,因此当您在其中创建 VStack 时,您会在列表中创建一行,但如果您删除 VStack,则有 5行(4 个文本和一个按钮)

【讨论】:

那么这是否一定意味着一个列表项应该成为完整的按钮?如果我想要一个底部有一个按钮的列表项怎么办? 该行不会成为整个按钮,但是当您单击该行时,会触发该行中的所有按钮,这似乎是一种正常行为,您不应在一行中放置多个按钮设计。无论如何,有一个变通方法,你可以在Button上使用.onTapGesture ,这个动作只有在点击按钮时才会触发 多尝试一下,我认为你是对的。我可以在第 1 行添加轻击手势,向按钮添加动作,以及向按钮添加轻击手势,看起来 SwiftUI 会尝试找到最合适的动作来执行。我猜是有道理的。 在我的“相关”部分中有很好的相关答案:***.com/a/58634704/15745

以上是关于表单内堆栈内的按钮在边界外处于活动状态的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中设置按钮飞溅效果的边界?

带有大标题的 UISearchController 在选项卡栏中崩溃,“只有一个带有顶部边界的调色板可以在过渡之外处于活动状态”

泰山OFFICE技术讲座:绕排时,形状的左右边界研究,内边界外边界的提出

泰山OFFICE技术讲座:绕排时,形状的左右边界研究,内边界外边界的提出

云网融合 — 云网络的边界

从包含在 shapefile 边界内的 netcdf 文件中提取数据