首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么导航后窗体中的SwiftUI选取器会重新定位?

为什么导航后窗体中的SwiftUI选取器会重新定位?
EN

Stack Overflow用户
提问于 2019-11-09 04:55:23
回答 4查看 3.2K关注 0票数 22

单击选取器后,它将导航到选择视图。项目列表被渲染到离顶部太远的地方,但在动画完成后会被捕捉。为什么会发生这种情况?

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

我已经创建了一个最小的示例来排除导航栏标题和按钮、表单部分和其他细节:

代码语言:javascript
复制
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()
    }
}

这发生在预览模式、模拟器和设备上(Xcode11.2,模拟器中的iOS 13.2,设备上的13.3Beta1)。

EN

回答 4

Stack Overflow用户

发布于 2019-11-22 03:20:38

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

代码语言:javascript
复制
NavigationView {
    …
}.navigationViewStyle(StackNavigationViewStyle())

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

如果你需要另一个导航视图style.

  • Additionally,,它不会修复DogCoffee在评论中提到的水平重新定位。

这似乎是一个错误,即使它可能是由特殊的circumstances.

  • My触发的也不会工作。
票数 10
EN

Stack Overflow用户

发布于 2020-01-03 15:32:52

在我看来,这与导航栏有关。默认情况下(未提及.navigationBarTitle扩展),导航显示模式设置为.automatic,应修改为.inline。我偶然发现了另一篇类似的文章,并使用他们的解决方案与您的解决方案相结合,通过使用.navigationBarTitle("", displayMode: .inline)应该会有所帮助。

代码语言:javascript
复制
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()
    }
}
票数 5
EN

Stack Overflow用户

发布于 2019-12-11 02:59:59

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

代码语言:javascript
复制
let navView = NavigationView {
    …
}
if UIDevice.current.userInterfaceIdiom == .pad {
    return AnyView(navView.navigationViewStyle(DoubleColumnNavigationViewStyle()))
} else {
    return AnyView(navView.navigationViewStyle(StackNavigationViewStyle()))
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58773687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档