【问题标题】:Why is SwiftUI picker in form repositioning after navigation?为什么 SwiftUI 选择器在导航后重新定位表单?
【发布时间】:2020-03-05 12:10: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
  • 同样的问题 - 非常烦人。如果您对导航栏使用内联样式,它就会消失。
  • ...单元格中的文本也会跳动 - 向右大约 4 px
  • @DogCoffee:我将水平跳跃调试为改变插图。这可以通过使用.listRowInsets() 显式设置来解决。
  • 我在玩 Xcode 11.4.1 时也遇到了这个问题。我决定下载最新的 Xcode beta (11.5 beta 2) / iOS 13.5,看看它是否有修复。带槽口的 iPhone(如 11)不再重新定位,但没有槽口的 iPhone(SE 2)仍然有这种行为。希望苹果在以后的 beta/11.5 版本中修复这个问题。

标签: ios forms swiftui picker


【解决方案1】:

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

NavigationView {
    …
}.navigationViewStyle(StackNavigationViewStyle())

这是我的问题的解决方案,但我不会将此标记为已接受的答案(目前)。

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

【讨论】:

  • 如果您的应用程序在 iPad 上运行,这也很有用,否则您的模态视图会显示为主 - 细节拆分视图。
【解决方案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()
    }
}

【讨论】:

  • 这解决了这个问题,但它也改变了我不需要的标题样式。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    感谢大家的这个话题!真的帮助我更多地了解事情并解决我的问题之一。为了与他人分享,我遇到了这个问题,但是当我将一个部分设置为出现在带有切换的部分的 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

    【讨论】:

      猜你喜欢
      • 2021-10-16
      • 1970-01-01
      • 2021-11-23
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多