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

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

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

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

Q&A

解決済

2回答

2967閲覧

NavigationControllerとTabberControllerを使用時のaddSubviewについて

swift_dev_1989

総合スコア24

Swift

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

0グッド

0クリップ

投稿2017/10/02 08:43

編集2017/10/03 07:17

イメージ説明

添付画像のようなダイアログをSwiftにて実現したいのです。
ダイアログ以外の領域を選択不可にし、下の画面が透けているUI。
NavigationControllerとTabberControllerを使用時にうまくいきません。
TabberControllerが選択できてしまいます。
おそらく上に重ねているViewの高さがおかしいと思うのですが、わかる方おられますでしょうか。

試したコードは下記となります。

・表示させるViewControllerのダイアログ表示時の処理

let infomationDialog:CustomDialogView = UINib(nibName: "CustomDialogView", bundle: nil).instantiate(withOwner: self,options: nil)[0] as! CustomDialogView // ダイアログ外の背景を暗く半透明に変更 let viewColor = UIColor.black infomationDialog.backgroundColor = viewColor.withAlphaComponent(0.85) infomationDialog.dialogBaseView.layer.cornerRadius = 5.0 // 貼り付ける // self.view.addSubview(infomationDialog) self.navigationController!.view.addSubview(infomationDialog)

・カスタムダイアログクラス

class CustomDialogView: UIView { @IBAction func closeButtonClicked(_ sender: UIButton) { self.removeFromSuperview() } }

CustomDialogViewのレイアウトはxibファイルにて設定しています

コメントアウトしているself.view.addSubview(infomationDialog)にて実装すると
ナビゲーションエリアとタブエリアの両方選択できてしまいました。
self.navigationController!.view.addSubviewにするとナビゲーションエリアは選択できませんが、タブエリアは選択できてしまいます。
(おそらくナビゲーションエリア分だけ、重ねているViewが上にずれたため、画面下部が選択できてしまっているように見えます。)

お手数ですがよろしくお願いいたします。

※追記
添付画像はLineアプリの画像であり、私が実装したものではありません。
例として、このようなダイアログを実装したいというものです。

記載している私のコードで実装した場合、スヌーピーの部分が暗くなりません。
そして選択できてしまいます。
正しいかわかりませんが、ナビゲーションエリアとステータスバーの高さ分だけ
上に重ねているViewの高さが画面下部に足りていないように見えます。

イメージ説明

実装後のイメージを追加します。
タブ部分が選択できてしまいます。

追加

xib
イメージ説明

指摘後追加

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

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

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

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

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

fuzzball

2017/10/02 10:37 編集

暗くなっている画面下部のスヌーピーのタブバーが選択出来てしまう、ということでしょうか?
swift_dev_1989

2017/10/02 10:49

わかりにくく、すみません。追記しましたのでご確認をお願い致します。
fuzzball

2017/10/03 00:31 編集

(deleted)
guest

回答2

0

ベストアンサー

addSubview

今回の場合でしたら、TabBarControllerのviewか、Windowに乗せれば実現できると思います。

swift

1//TabBarControllerに乗せる場合 2self.tabBarController?.view.addSubview(infomationDialog) 3 4//Windowに乗せる場合 5UIApplication.shared.keyWindow?.addSubview(infomationDialog)

サイズ設定

swift

1override func viewDidLayoutSubviews() { 2 super.viewDidLayoutSubviews() 3 4 if let window = UIApplication.shared.keyWindow { 5 infomationDialog.frame = window.bounds 6 } 7}

投稿2017/10/03 00:36

編集2017/10/03 06:09
fuzzball

総合スコア16731

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

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

swift_dev_1989

2017/10/03 04:05

ご回答ありがとうございます。 非常にたすかりました。 ただサンプルで作成したアプリではうまくいったのですが、本番のアプリではやはり下部分が隠れず、操作できてしまっています。 表示処理は全く同じコードなので、アプリの設定レベルなのか、、いろいろ試したのですが、解決せずでした。。
fuzzball

2017/10/03 04:22

Windowに乗せてもうまくいかないのであれば、黒いViewのサイズがおかしいんじゃないかと思われますが‥。サイズを設定しているコードを書けますか?(現在のサイズはどうなってますか?)
swift_dev_1989

2017/10/03 05:24 編集

曖昧な質問で申し訳ありません。 本番アプリの現状のキャプチャをUPしました。(わかりやすく背景を白にしました。) サイズに関しては設定は特にしておらず、xibファイル上でレイアウトを作っただけです。 全く同じ方法でサンプルで作成したアプリではご教示いただいた方法でうまくいきました。 ただ本番の方ではうまくいきません。 サイズということですが、試しにうまくいったサンプルの方のxibを本番でも使用しましたがうまくいきませんでした。(それが添付画像となります) サンプルと本番アプリの設定等見比べたのですが、とくに気づける点はありませんでした。 曖昧な質問のため、難しいと思いますが、何か気になる点があればご指摘ください。
fuzzball

2017/10/03 05:26

コード側でサイズをしていないなら、Viewのサイズはxib上のサイズそのままになります。(仮に、今試している機種でOKでも、別の機種だとNGになるはず) サイズ設定のコードを回答に追記しますので試してみて下さい。
swift_dev_1989

2017/10/03 05:37

ご回答ありがとうございます。 試した結果、添付画像のように白い部分がさらに小さくなってしまいました。
swift_dev_1989

2017/10/03 05:40

追記します。 うまく言っている方のアプリをiPadのシミュレータにて動作させたところ ご指摘の通り、うまくいきませんでした。 やはりサイズの問題のようです。。
fuzzball

2017/10/03 05:47

さっきのframe設定の下に、 print(self.view.bounds) print(UIApplication.shared.keyWindow?.frame) print(self.tabBarController?.view.frame) を追加して出力を教えて下さい。(warningは無視していいです)
swift_dev_1989

2017/10/03 05:51

ありがとうございます。 iPhone7のシミュレータにて試しました。 下記となります。 (0.0, 0.0, 375.0, 554.0) Optional((0.0, 0.0, 375.0, 667.0)) Optional((0.0, 0.0, 375.0, 667.0))
swift_dev_1989

2017/10/03 05:55

すみません。 下記でいけそうです! infomationDialog.frame = (UIApplication.shared.keyWindow?.frame)!
fuzzball

2017/10/03 06:03 編集

ViewControllerのviewが画面一杯になっていないようですね。 修正方法はそれでいいと思います。(回答も修正しておきます)
swift_dev_1989

2017/10/03 07:14

本当に助かりました。 ありがとうございました!!!
guest

0

UIViewをaddSubviewする方式だと、どうしてもナビゲーション領域には手が届かなくなります。
その場合、UIWindowを重ねるという手があります。

https://stackoverflow.com/questions/19995526/to-create-a-new-uiwindow-over-the-main-window

普通にViewを扱うのとだいぶ要領が違ってくるんですが、全画面を覆う場合にはこれが一番ストレートな対策なように思います

投稿2017/10/03 00:08

YokemuraTakeshi

総合スコア297

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

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

swift_dev_1989

2017/10/03 07:16

ご回答ありがとうございます。 今回は別の方法で実装できました。 UIWindowに関しても調べていたのですが、なかなかレイアウトファイルと結びつける方法かつSwiftでというところでうまくいってませんでした。 またUIWindowに関しても調べたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問