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


12

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

演示: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)。


YouTube上有一段相当近期的视频,它演示了SwiftUI的基本形式,并且可以正常运行,所以我想这不是SwiftUI本身的错误:youtu.be/Ho88Eid9gi0?
t=573

同样的问题-非常烦人。如果您对导航栏使用嵌入式样式,它将消失。
DogCoffee

3
...单元格中的文本也跳-右侧约4 px
DogCoffee

2
@DogCoffee:我调试了水平跳跃以改变插图。可以通过使用显式设置它们来解决此问题.listRowInsets()
Koraktor

非常感谢,效果很好。
DogCoffee

Answers:


6

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

NavigationView {}.navigationViewStyle(StackNavigationViewStyle())

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

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

如果您的应用程序在iPad上运行,这也很有用,否则您的模式视图将显示为主视图-详细视图。
DogCoffee

2

我认为,这与导航栏有关。默认情况下(不提及.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()
    }
}

这可以解决此问题,但它也会更改标题样式,这对我而言是不希望的。
Koraktor

2

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

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

0

谢谢大家的关注!确实帮助我了解了更多东西,并解决了我的问题之一。与其他人共享时,我遇到了这个问题,但是当我将一个节设置为出现在具有切换功能的节的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文本水平

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.