SwiftUI 软件键盘 + 两个 TextFields = 约束冲突

Posted

技术标签:

【中文标题】SwiftUI 软件键盘 + 两个 TextFields = 约束冲突【英文标题】:SwiftUI Software keyboard + two TextFields = Constraint conflict 【发布时间】:2020-07-12 17:34:55 【问题描述】:

TL;DR

在键盘显示时点击第二个TextField 会触发约束冲突。

详情

下面的代码可以按原样运行。点击顶部TextField,然后点击下方。 Xcode 控制台报告了这一点(为清楚起见进行了删节):

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 

    <'assistantHeight' TUISystemInputAssistantView.height == 44   (active)>
    <'assistantView.bottom' TUISystemInputAssistantView.bottom == _UIKBCompatInputView.top   (active)>
    <'assistantView.top' V:|-(0)-[TUISystemInputAssistantView]   (active, names: '|':UIInputSetHostView )>
    <'inputView.top' V:|-(0)-[_UIKBCompatInputView]   (active, names: '|':UIInputSetHostView )>

Will attempt to recover by breaking constraint 
    <'assistantView.bottom' ...>

问题

AFAIK 我无法控制这四个约束中的任何一个。有没有办法避免这种情况?我应该担心吗?

代码

struct ContentView: View 
    @State private var text1 = ""
    @State private var text2 = ""

    var body: some View 
        VStack 
            TextField("Tap here first...", text: $text1)
            .background(Color.white).padding()

            TextField("...then tap here", text: $text2)
            .background(Color.white).padding()

            Spacer()
        .background(Color.gray)
    

【问题讨论】:

【参考方案1】: 你解决了吗? 如果不是,也许这会有所帮助!
GeometryReader.init  geometry in
        ScrollView.init 
            VStack.init(alignment: .leading, spacing: nil, content: 
                Text("Hello.")
                    .font(.custom("Helvetica-Bold", size: 32))
                Text("This just my sample application using swift UI")
                    .padding(.init(top: 0, leading: 0, bottom: 0, trailing: (geometry.size.width * 0.35)))
                    .foregroundColor(.gray)
                TextField.init("Email Address", text: self.$textFieldName)
                    .frame(width: geometry.size.width, height: 50)
                    .disableAutocorrection(true)
                    .layoutPriority(1000)
                TextField.init("Email Address", text: self.$textFieldName)
                    .frame(width: geometry.size.width, height: 50)
                    .disableAutocorrection(true)
                    .layoutPriority(1000)
            )
        
    

如果您想知道会发生什么限制它,因为您的键盘具有自动更正功能。

使用这条线,.disableAutocorrection(&lt;#Bool?#&gt;) 摆脱键盘顶部的自动更正选项卡。

【讨论】:

谢谢,将修饰符添加到任一 TextFields 可以防止投诉。并向我展示了键盘视图的“违规”部分是顶部的自动更正窗格。

以上是关于SwiftUI 软件键盘 + 两个 TextFields = 约束冲突的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 键盘工具栏范围

我的搜索栏中的文本字段不允许输入文本(swiftUI)

键盘处理 swiftui

Swift/SwiftUI - 删除键盘上方的空间

如何使用 swiftui 创建表情符号键盘?

如何始终在 SwiftUI 中显示键盘