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

时间:2020-05-30 14:07:37

标签: swiftui uinavigationbar

使用UIKit添加导航栏项目时,可以使用UIBarButtonItem.style设置其样式。这对于Done按钮(以粗体显示)很重要。

SwitftUI的navigationBarItems(leading:trailing:)采用bold,但没有样式。您可以通过在视图中使用粗体按钮来破解外观相似的样式,但它不会适应将来的操作系统样式更改(例如,let currentPlayer = "X"; $(".cell").on('click', function() { if (currentPlayer == "X" && $(this).hasClass("takenByX" || "takenByO")) { //checks to see if square has been played (""); //does nothing } else if (currentPlayer == "X") { $(this).text("X").addClass("takenByX"); //change clicked square to x & adds class taken playerChange();} //runs player change function if(currentPlayer == "O" && $(this).hasClass("takenByX" || "takenByO")) { //checks to see if square has been played (""); //does nothing } else if (currentPlayer == "O") { $(this).text("0").addClass("takenByO"); //change clicked square to o & adds class taken playerChange(); //runs player change function }}); function playerChange() { if (currentPlayer === "X"){ //if current player is x, then switch to o currentPlayer = "O"; } else { currentPlayer = "X"; //if current player is not x then switch to x } winner(); } $("button").on('click', function() { //click function for restart game button $('.cell').text(""); //removes all added text from the cells $('.cell').removeClass("takenByX"); //removes the taken class from the cells $('.cell').removeClass("takenByO"); $('h1').text("C R O S S E S & & N O U G H T S").append; if (currentPlayer == "O"){ playerChange(); //changes back to player x so o doesnt play first } }); function winner(){ if ( $(".cell1" && ".cell2" && ".cell3").hasClass("takenByX") || // - $(".cell1" && ".cell5" && ".cell9").hasClass("takenByX") || // \ $(".cell1" && ".cell4" && ".cell7").hasClass("takenByX") || // | $(".cell2" && ".cell5" && ".cell8").hasClass("takenByX") || // | $(".cell3" && ".cell6" && ".cell9").hasClass("takenByX") || // | $(".cell4" && ".cell5" && ".cell6").hasClass("takenByX") || // - $(".cell7" && ".cell8" && ".cell9").hasClass("takenByX") // - ){ $('h1').text("Congratulations Winner!").append; } else { (""); //do nothing }} if ( $(".cell1" && ".cell2" && ".cell3").hasClass("takenByO") || // - $(".cell1" && ".cell5" && ".cell9").hasClass("takenByO") || // \ $(".cell1" && ".cell4" && ".cell7").hasClass("takenByO") || // | $(".cell2" && ".cell5" && ".cell8").hasClass("takenByO") || // | $(".cell3" && ".cell6" && ".cell9").hasClass("takenByO") || // | $(".cell4" && ".cell5" && ".cell6").hasClass("takenByO") || // - $(".cell7" && ".cell8" && ".cell9").hasClass("takenByO") // - ){ $('h1').text("Congratulations Winner!").append; } else { (""); //do nothing } //if a winner is declared stop allowing clicks? 以外的font weight)。

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

2 个答案:

答案 0 :(得分:2)

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

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

.navigationBarItems(
  leading:
    Button(action: {}) {
      Text("Cancel")
  },
  trailing:
    Button(action: {}) {
      Text("Save")
    }
  )

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

.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")
    }
  )

这样做的好处是您不需要了解“UIBarButtonItem.style:”的概念,您只需要了解Button 是什么以及{{1 }} 是 - 随着时间的推移应该熟悉哪些 API,因为它们是标准构建块。

enter image description here

答案 1 :(得分:-1)

在SwiftUI中

而不是传递样式,而是将其附加到View组件。这将适应将来的操作系统样式更改:

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())