在SwiftUI中设置导航栏项目样式

在SwiftUI中设置导航栏项目样式,swiftui,uinavigationbar,Swiftui,Uinavigationbar,使用UIKit添加导航栏项目时,可以使用设置其样式。这对于以粗体文本显示的按钮很重要 SwitftUI采用视图,但没有样式。您可以通过在视图中使用粗体按钮来修改样式,但它不会适应未来操作系统样式的更改(例如,除粗体之外的样式) 如何使用SwiftUI设置导航栏项的样式?在SwiftUI中,您可以将样式附加到视图组件,而不是传递样式。这将根据未来操作系统样式的变化进行调整: import SwiftUI import PlaygroundSupport struct ContentView: V

使用UIKit添加导航栏项目时,可以使用设置其样式。这对于以粗体文本显示的按钮很重要

SwitftUI采用
视图
,但没有样式。您可以通过在视图中使用粗体按钮来修改样式,但它不会适应未来操作系统样式的更改(例如,除
粗体
之外的样式)


如何使用SwiftUI设置导航栏项的样式?

在SwiftUI中,您可以将样式附加到视图组件,而不是传递样式。这将根据未来操作系统样式的变化进行调整:

import SwiftUI
import PlaygroundSupport

struct ContentView: View {
  var body: some View{
    NavigationView {
      Text("blah")
        .navigationBarItems(leading: Text("done button")
          .fontWeight(.medium)
          .bold()
          .foregroundColor(Color.red))
    }
  }
}

PlaygroundPage.current.setLiveView(ContentView())



我认为我们必须改变对SwiftUI的看法,因为“uibarbuttoneim.style”的概念不会直接适用。SwiftUI试图隐藏实现细节,并希望根据上下文将字体大小更改为“自动神奇工作”等概念

在Xcode 12.3和iOS 14.3上,默认情况下按钮样式为粗体(在NavigationView上下文中)

更改样式的一种方法是添加按钮样式:

.navigationBarItems(
  leading:
    Button(action: {}) {
      Text("Cancel")
    }.buttonStyle(PlainButtonStyle()),
  trailing:
    Button(action: {}) {
      Text("Save")
    }
  )
但这并没有达到预期的效果我必须更改字体大小,使“取消”为常规样式,而“保存”为粗体…就像标准iOS一样:

.navigationBarItems(
  leading:
    Button(action: {}) {
      Text("Cancel")
        .fontWeight(Font.Weight.regular)
    },
  trailing:
    Button(action: {}) {
      Text("Save")
    }
  )
这样做的好处是,您不需要了解“uibarbuttonim.style”的概念:“您只需要了解
按钮
是什么,以及
文本
是什么——随着时间的推移,哪些API应该是熟悉的,因为它们是标准构建块


我假设所有SwiftUI导航栏项目都作为customView项目处理(可能标准后退按钮除外),因此如果您指定一些样式为粗体,它将始终为粗体。您的代码示例正在将
fontWeight
bold
foregroundColor
应用于
Text
,而不是导航栏项。iOS似乎不太可能自动调整这些特定应用的属性。我认为当你切换到黑暗模式时,iOS甚至不会改变红色的阴影。你能指出你期望的行为被记录在哪里吗?对操作系统版本差异的良好观察。要在所有操作系统版本中获得与苹果应用程序相似的体验,您必须同时设置常规字体和粗体字体的权重。真是一团糟!您不仅需要在字体大小的抽象级别上工作,甚至没有一个稳定的默认值。UIKit让您指示按钮是否为“完成”按钮的方法要好得多。
.navigationBarItems(
  leading:
    Button(action: {}) {
      Text("Cancel")
        .fontWeight(Font.Weight.regular)
    },
  trailing:
    Button(action: {}) {
      Text("Save")
    }
  )