web-dev-qa-db-ja.com

ナビゲーションバーの戻るボタンのフォントを変更するにはどうすればよいですか?

ナビゲーションバーの戻るボタンのフォントを変更するにはどうすればよいですか。

戻るボタンは、「戻る」または前のView Controllerのタイトルです。

このviewDidLoadは機能すると思いました。

navigationController?.navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: UIControlState.Normal)

しかし leftBarButton?オプションはnilを返します。

35
Kyle Goslan

コードをテストしたところ、行がnilを返しているのは、実際にはname: "FONTNAME"はnilを返します。そのため、そのname属性を有効なフォント名に設定すると、navigationController?.navigationItem.leftBarButtonItemは明示的にnilに設定されます。

しかし、私がテストで見たように、この行はあなたが明らかに望む結果を与えません。先頭のnavigationControllerオプションは、現在のビューではなくUINavigationControllerにアクセスするため、そこにあるべきではありません。 UIViewControllerの独自のnavigationItemプロパティを使用して、そのleftBarButtonItemに直接アクセスします(例:

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: "goBack")
navigationItem.leftBarButtonItem = backButton
navigationItem.leftBarButtonItem?.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)

編集:この回答の下で投稿したコメントから、実際にはleftBarButtonItemを設定したくないが、backBarButtonItemは設定しないため、前のView Controllerに戻るだけでなく、カスタムアクションを実装したい。

そのため、以前のView Controller(つまり、カスタムの戻るボタン項目を表示する前のビュー)では、次のようなアクションなしでカスタムの戻るボタンを設定できます。

let backButton = UIBarButtonItem(title: "< Back", style: UIBarButtonItemStyle.Plain, target: self, action: nil)
backButton.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Chalkduster", size: 20)!], forState: UIControlState.Normal)
navigationItem.backBarButtonItem = backButton
29
Lyndsey Scott

アプリ全体でフォントスタイル全体を変更する必要がある場合(別名、各ナビゲーションボタン)、推奨される方法はUIBarButtonItem.appearance()プロキシを使用することです。

サンプルコードスニペットは次のようになります。

Swift 3.0 +

_//make sure font name u use below *actually* exists in the system !
//if it doesn't app will crash because we're force unwrapping an optional (see below) !!!
let customFont = UIFont(name: "customFontName", size: 17.0)!
UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: customFont], for: .normal)
_

アプリを起動するたびにフォントのスタイル設定を行う必要があるため、このコードスニペットを_AppDelegate.Swift_ファイルの先頭のどこかに置くのが賢明です。また、このコードを他の場所(例:Presenterクラス)に置いて、UIのスタイル設定とカスタマイズを行っても安全です。このコードが実行されるとすぐに、その後すべてのBarButtonsがカスタマイズされます。


[〜#〜] but [〜#〜]true Swift ????)必要に応じて、フォントのラップを解除し、見つからない場合やフォントの読み込み中にその他の問題が発生した場合は、最終的にシステムフォントにフォールバックします。

_var textAttributes: [String:Any]

//custom font setup
let fontColor = UIColor.purple
let barItemCustomFont = UIFont(name: "????", size: 14)  //note we're not forcing anything here

//can we use our custom font ????
if let customFont = barItemCustomFont {
    //hooray we can use our font ????
    textAttributes = [NSForegroundColorAttributeName: fontColor, NSFontAttributeName: customFont]
} else {
    //???? not found -> omit setting font name and proceed with system font
    textAttributes = [NSForegroundColorAttributeName: fontColor]
}

//finally
UIBarButtonItem.appearance().setTitleTextAttributes(textAttributes, for: .normal)
_

実世界の例

実際のアプリでは、通常、UINavigationBarUIBarButtonの両方のフォントスタイル(他のパラメーターを除く)をカスタマイズして、視覚的に一貫性を保つ必要があります。使用できる便利な_stylizeNavigationFontOfMyAmazingApp????_関数を次に示します。

_func stylizeNavigationFontOfMyAmazingApp????() {
    //custom font
    let customFont = UIFont(name: "someFancyFont", size: 16)!  //note we're force unwrapping here

    //navigation bar coloring:
    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().barTintColor = UIColor.blue

    //unique text style:
    var fontAttributes: [String: Any]
    fontAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: customFont]

    //navigation bar & navigation buttons font style:
    UINavigationBar.appearance().titleTextAttributes = fontAttributes
    UIBarButtonItem.appearance().setTitleTextAttributes(fontAttributes, for: .normal)
_

}


appearance()プロキシを使用する利点

  • アプリ/プロジェクト内のeveryUIBarButtonItemをスタイル設定するための2つのライナーコードスニペット。
  • いくつかのクラスのappearance()プロキシを組み合わせて、真にユニークな視覚スタイルを得ることができます
  • カスタマイズの制御がさらに必要な場合は、UIBarButtonItemの特定のインスタンスで、各ボタンをさらにカスタマイズし直すことができます(カスタムビュー、ボタン、画像などを配置するなど)。

参照

Apple Docsappearanceプロトコルで。

64
Vexy

この変更をすべてのアプリケーションに適用する場合は、以下のコードを使用できます。

Swift 4

application関数のAppDelegate.Swiftにこれらの行を追加しました:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
       UINavigationBar.appearance().titleTextAttributes = [
            NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 20)!
        ]

        UIBarButtonItem.appearance().setTitleTextAttributes([NSAttributedStringKey.font: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)

  return true
}

Swift

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    UINavigationBar.appearance().titleTextAttributes = [
        NSFontAttributeName: UIFont(name: "IranSansMobile", size: 20)!
    ]

    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "IranSansMobile", size: 15)!], for: UIControlState.normal)


    return true
}
20
Milad Faridnia

スイフト3

    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!,NSForegroundColorAttributeName: UIColor.white]
    UIBarButtonItem.appearance().setTitleTextAttributes([NSFontAttributeName: UIFont(name: "Open Sans", size: 15)!], for: UIControlState.normal)
3
Ahmed Safadi

既にUIBarButtonItemを設定していることが確かな場合、次のことができます:

self.navigationItem.leftBarButtonItem!.title = "myTitle"

変更するには次のことができる色:

self.navigationItem.leftBarButtonItem!.tintColor = UIColor.redColor()

ストーリーボードで設定していない場合は、次のことができます。

self.navigationItem.leftBarButtonItem = UIBarButtonItem()

フォントを変更するには、次の手順を実行します。

self.navigationItem.leftBarButtonItem!.setTitleTextAttributes([NSFontAttributeName: UIFont(name: "FONTNAME", size: 20)!], forState: .Normal)

おそらくself .navigationControllerを使用してはならないことに言及する必要があります。これは、navigationControllerのボタンを設定するときに、画面上に表示されず、画面上にありストーリーボードに設定されたボタンself.navigationItem...

3
borchero