为什么导航后表单中的SwiftUI选择器会重新定位?

时间:2019-11-08 20:55:22

标签: ios forms swiftui picker

单击选择器后,它将导航到选择视图。项目列表的渲染距离顶部太远,但是在动画结束后会迅速对齐。为什么会这样?

演示:https://gfycat.com/idioticdizzyazurevase

我已经创建了一个最小的示例,以排除导航栏标题和按钮,表单部分以及其他详细信息:

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
        }
    }
}

struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}

这发生在预览模式,模拟器和设备上(Xcode 11.2,模拟器中的iOS 13.2,设备上的13.3 beta 1)。

4 个答案:

答案 0 :(得分:3)

我认为,这与导航栏有关。默认情况下(不提及.navigationBarTitle扩展名),导航显示模式设置为.automatic,应将其修改为.inline。我遇到了另一篇与此类似的文章,并通过使用.navigationBarTitle("", displayMode: .inline)应该可以帮助他们将其解决方案与您的解决方案结合使用。

import SwiftUI

struct NewProjectView: View {

    @State var name = ""

    var body: some View {
        NavigationView {
            Form {
                Picker("Client", selection: $name) {
                    Text("Client 1")
                    Text("Client 2")
                }
            }
            .navigationBarTitle("", displayMode: .inline)
        }
    }
}


struct NewProjectView_Previews: PreviewProvider {
    static var previews: some View {
        NewProjectView()
    }
}

答案 1 :(得分:2)

强制将导航视图样式堆叠时,可以解决明显的错误行为:

NavigationView {
    …
}.navigationViewStyle(StackNavigationViewStyle())

这是解决我的问题的方法,但我不会将其标记为已接受的答案。

  1. 这似乎是一个错误,即使它可能是由特殊情况触发的。
  2. 如果您需要其他导航视图样式,我的解决方案将无法正常工作。
  3. 此外,它不会解决DogCoffee在评论中提到的水平重新定位。

答案 2 :(得分:1)

谢谢大家的关注!确实帮助我了解了更多东西,并解决了我的问题之一。与其他人共享时,我遇到了这个问题,但是当我将一个节设置为出现在具有切换的节上的if / else语句中时,我也遇到了这个问题。激活切换后,它将使节标题水平移动几个像素。

以下是我的解决方法

Section(header: Text("Subject Identified").listRowInsets(EdgeInsets()).padding(.leading)) {
                Picker(selection: $subIndex, label: Text("Test")) {
                    ForEach(0 ..< subIdentified.count) {
                        Text(self.subIdentified[$0]).tag($0)
                    }
                }
            .labelsHidden()
            .pickerStyle(SegmentedPickerStyle())

我的选择器选择视图上仍存在水平移动,并且不确定如何解决。我创建了另一个线程来接收输入。再次感谢! SwiftUI Shift Picker Text Horizontal

答案 3 :(得分:0)

在解决此错误之前,解决此问题的另一种方法是同时有条件地设置该样式,同时保留iPad的DoubleColumnNavigationViewStyle:

let navView = NavigationView {
    …
}
if UIDevice.current.userInterfaceIdiom == .pad {
            return AnyView(navView.navigationViewStyle(DoubleColumnNavigationViewStyle()))
        } else {
            return  AnyView(navView.navigationViewStyle(StackNavigationViewStyle()))
        }