SwiftUI大小适应或自动换行导航栏标题

3

我有一个导航标题,在某些较小的设备上太大了。 我已经阅读了很多设置UINavigationBar.appearance()titleTextAttributeslargeTitleTextAttributes的方法,但是当设置段落样式为自动换行时,它似乎会删除标准的...裁剪,并使文本继续超出屏幕边缘而不进行换行:

init() {
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineBreakMode = .byWordWrapping
    UINavigationBar.appearance().largeTitleTextAttributes = [
        .paragraphStyle: paragraphStyle
    ]
}

我希望保持SwiftUI的行为,即标题会显示为大号文本,直到视图被向上滚动并移动到导航栏中,因此直接获取.toolbar不会有所帮助。
我也不想仅指定较小的字体,因为我只希望在必要时缩小或换行。
有人成功实现了这个吗?

2
解决方案最终变得相当简单。https://dev59.com/1lYN5IYBdhLWcg3wopUD#68428803 - Darren
如果您能够在SwiftUI项目中说明实际使用该解决方案的位置,那会很有帮助。从您链接的帖子中并不明显知道将代码放在哪里。 - rikitikitavi
1
你可以将它放在视图的初始化或甚至是应用程序委托中。 - Darren
2个回答

6
您可以在视图的初始化程序中添加此行,以解决您遇到的问题。
UILabel.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).adjustsFontSizeToFitWidth = true

例子:

struct YourView: View {
    init() {
        UILabel.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).adjustsFontSizeToFitWidth = true
    }

    var body: some View {
        NavigationView {
            Text("Your content")
                .navigationBarTitle("Very very large title to fit in screen")
        }
    }
}

1

在 Jose 的回答基础上,如果您想将此应用于您的应用程序中的所有导航标题,请将该行放置在 App 结构的 init 函数中:

@main
struct MyApp: App {
    init() {
        UILabel.appearance(whenContainedInInstancesOf: [UINavigationBar.self]).adjustsFontSizeToFitWidth = true
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接