【问题标题】:SwiftUI TextField takes max widthSwiftUI TextField 采用最大宽度
【发布时间】:2020-09-30 05:17:27
【问题描述】:

我有一个导航列表,每个列表项都采用这种格式:

HStack {
        TextField("Insert something here.",text: self.$userData.pages[i].title)
            .border(Color.blue)
        Spacer()
    }

这导致以下视图:

The touchable area is highlighted by the blue border and it takes the whole width of the row

这样做的问题是,尽管列表项是一个导航链接,但用户单击该项的任何位置都会导致他们编辑文本内容。我更喜欢的是与Text 具有相同宽度的TextField

The blue border wraps the text instead of taking the max width

因此,如果用户在TextField 之外单击,导航将起作用,但如果他们在文本上单击,它将让他们编辑文本。 (上面的视图带有Text字段)。

如果我问了一个不清楚或不好的问题,我们深表歉意。我是 Stack Overflow 和 SwiftUI 的新手。

编辑:

我尝试使用fixedSize 修饰符,TextField 正确包装了我的文本,但现在导航链接不起作用(即单击它只是无法导航)。这是我的完整代码:

NavigationLink(destination: PageView(page: self.userData.pages[i])) {
                        HStack {
                            Button(action: {}){
                                TextField(" ", text: self.$userData.pages[i].title)
                                .fixedSize()

                            }
                            .buttonStyle(MyButtonStyle())
                            .border(Color.blue)
                            Spacer()
                        }
                    }

【问题讨论】:

标签: swift swiftui swiftui-navigationlink


【解决方案1】:

不用道歉,你的问题很清楚。 您可以使用fixedSize() 来做到这一点

所以你的代码应该是这样的

HStack {
        TextField("Insert something here.",text: self.$userData.pages[i].title)
            .border(Color.blue)
            .fixedSize()
        Spacer()
    }

您可以进一步指定您希望如何拉伸,verticalhorizontal 甚至两者都通过传递参数,如下所示 .fixedSize(horizontal: true, vertical: false)

更新答案以符合您的新要求

import SwiftUI

struct StackOverflow5: View {
    @State var text: String = ""
    @State var selection: Int? = nil

    var body: some View {
        NavigationView {
            ZStack {
                NavigationLink(destination: Page2(), tag: 1, selection:self.$selection) {
                    Color.clear
                        .onTapGesture {
                            self.selection = 1
                        }
                }


                TextField("Text", text: self.$text)
                    .fixedSize()
            }
        }
    }
}

struct StackOverflow5_Previews: PreviewProvider {
    static var previews: some View {
        StackOverflow5()
    }
}

struct Page2: View {
    var body: some View {
        Text("Page2")
    }
}

我们在这里使用ZStack 来分隔TextFieldNavigationLink,以便它们可以单独交互。

注意Color.clear 在我们的TextField 之前的使用,这是故意的,以便我们的TextField 具有交互优先级。我们还使用了 Color.clear,因为它会作为背景拉伸,而且它是 clear,所以它不可见。

显然我在这里硬编码了1,但这可以来自ListForEach

另外,如果你不想使用selectiontag,你可以这样做

...
@State var isActive: Bool = false
...
NavigationLink(destination: Page2(), isActive: self.$isActive) {
     Color.clear
          .onTapGesture {
               self.isActive.toggle()
          }
}
....

【讨论】:

  • 非常感谢!我想我在浏览文档时忽略了fixedSize,因为它说它将视图固定在理想大小,我认为这与默认大小相同。
  • 不用担心,很高兴我能提供帮助。请记住,尽管fixedSize 是任何视图的函数,但不一定是TextField。祝你好运!
  • 所以我刚试过这个,我遇到了一个问题,虽然我不确定这是否是这个解决方案的错,但现在 NavigationLink 似乎不起作用。我知道 TextField 已正确包装,但单击该行并不能导航我。我尝试了模拟器和真机,但它似乎仍然无法正常工作。你有什么想法吗?
  • 知道了,我正在努力更新我的答案以反映。你对固定的宽度和高度好吗?因为一种解决方案是将所有内容包装在zStack 中,以便 NavigationLink 位于文本字段下,并且它需要 100% 的宽度和 100% 的高度,这样如果你点击 NavigationLink 你很好,如果你点击文本字段,那么你只更新文本字段。
  • 您指的是 NavigationLink 还是 TextField 的固定宽度/高度?我需要 TextField 来获取其中文本的宽度,但可以修复 navigationLink 的宽度/高度。
猜你喜欢
  • 2019-10-21
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2020-02-20
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2012-11-13
相关资源
最近更新 更多