質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

5769閲覧

iOSでNavigationBarの中央に画像を表示したい

taqm

総合スコア65

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/11/02 07:26

編集2017/11/02 08:08

現在iOSでアプリ作成を行なっており
要件として「ヘッダー部分の中央にはアプリのロゴを常に表示したい」といったものがあります。

色々試してみたもののうまくいかずで困っております。
なんとなく下記の案Bにてリピート無効&中央寄せができればと考えているのですが
方法がわかりません・・・。

こうやったらできる、またはこのアプローチの方が良いなど
ご存知の方はご教授いただきです。
よろしくお願いいたします。

試したこと

案A. navigationItem.titleViewに画像を指定

各ViewControllerにて下記のコードを実行

swift

1 let imageView = UIImageView(目的の画像) 2 imageView.contentMode = .scaleAspectFit 3 self.navigationItem?.titleView = imageView

この場合はいい感じに表示されるのですが
画面遷移を行なった場合にロゴがアニメーションしてしまうためダメでした

案B. UINavigationBar.appearance()のbackgroundImageを設定

AppDelegate.swiftにて下記のコードを実行

swift

1 let navibar = UINavigationBar.appearance() 2 let image = UIImage(目的の画像) 3 navibar.setBackgroundImage(image, for: .default)

画像は設定されるのでがナビゲーションエリアいっぱいに表示され、
さらにリピートされた状態で表示されてしまいます

環境

  • Swift4
  • xcode9
  • 対象OSは10以上

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

###質問内容について

質問の内容のコアを考えるとつまり動かないnavigationBarが欲しい、ということなんじゃないかと思います。
となるとこういう構成でいかがですか?

Storyboard

NC(UINavigationController)直下のViewController(navigationItem.titleにtitleと入ってるところ)にContainerViewを配置してその中にUINavigationControllerを配置。
ただしそのContainerView内のUINavigationControllerはattributes Inspectorでshows Navigation Barのチェックを外す。

あとはtaqmさんの質問内容に書かれてる案Aを採用(ただUINavigationControllerのカスタムクラスを作って、その中のviewDidLoadをoverrideするだけでいい気がします)すればnavigationBar.itemに配置したtitleViewはそのままに固定されます。

###サンプルコード

swift

1import UIKit 2 3class NC: UINavigationController { 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 let item = UINavigationItem() 7 let imageView = UIImageView() 8 imageView.image = UIImage(imageLiteralResourceName: "xxx_thumbnail.png") 9 item.titleView = imageView 10 navigationBar.items = [item] 11 } 12} 13

###余談

ContainerViewを採用するとdelegate周りが若干面倒になることがあります(ライフサイクルをちゃんと把握してなかった自分のしょっぱい経験談)。あとunwindするときもコード量増えちゃいそうですが、その辺は実装したい内容を優先するとトレードオフなところですかね。

投稿2017/11/03 00:31

xAxis

総合スコア1349

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taqm

2017/11/03 01:40

UINavigationControllerの中にUINavigationControllerを入れるとは・・・! こんな方法思いもつきませんでした。 この方法で頑張ってみます。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問