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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

2502閲覧

UIViewの背景色を透過したい

sunglass

総合スコア303

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2020/10/17 11:50

編集2020/10/18 08:38

UIIViewの背景色を透過したい。

https://qiita.com/takehiro224/items/dc5903ae42f288ccd5f7
の記事を参考にメニューを作成しました。
記事内では背景色を Opacity:0.5に設定するように書かれています。
が、Xcode(IDE)のStroyboardにがOpcaityは見当たらなくてAlphaしかありません。
そこの値を0.5にするも画面が真っ黒のままです。

その他にも...

試したこと
・Storyboard側のAplphaの数値を下げてみた
・Storyboard側のUIColorのOpacityの数値を下げてみた
・レイヤーの順番を確認

と試してBuildするも背景色は真っ黒です。
どうやったら背景色を透過できるのでしょうか。。

import UIKit class MenuViewController: UIViewController { @IBOutlet weak var menuView: UIView! override func viewDidLoad() { super.viewDidLoad() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // メニュー画面の位置 let menuPosition = self.menuView.layer.position // 初期位置設定 self.menuView.layer.position.x = -self.menuView.frame.width // 表示アニメーション UIView.animate( withDuration: 0.1, delay: 0, options: .curveEaseOut, animations: { self.menuView.layer.position.x = menuPosition.x }, completion: { bool in }) } // メニュー外をタップした場合に非表示にする override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesEnded(touches, with: event) for touch in touches { if touch.view?.tag == 1 { UIView.animate( withDuration: 0.2, delay: 0, options: .curveEaseIn, animations: { self.menuView.layer.position.x = -self.menuView.frame.width }, completion: { bool in self.dismiss(animated: true, completion: nil) } ) } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }

イメージ説明
イメージ説明
イメージ説明
イメージ説明

// コード① let blackColor = UIColor.black let transparentBlackColor = blackColor.setAlpha(alpha: 0.5) self.view.backgroundColor = transparentBlackColor

コード①だと真っ黒になります。
UIColor.redにすると 赤黒になります。
何の黒色が残っているのかがわかりません。。

実際のコードではPresentationは Full Screenとなっています。
イメージ説明

イメージ説明
Viewには現在 白色をAlpha:1.0で設定しています。
※最初の質問投稿時は黒色にAlpha:0.5でした。

追記
イメージ説明
もとの遷移元の画像

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

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

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

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

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

mskRR

2020/10/18 03:57 編集

もとのviewControllerの背景色が黒なんじゃないですか? 戻るセグエも見直されたほうが良いと思います。
sunglass

2020/10/18 04:44

> もとのviewControllerの背景色が黒なんじゃないですか? Stroyborad側でviewControllerの背景色を確認するも色の設定項目もなく、.swift側でも同様に色についての記述は見当たらないです。 > 戻るセグエも見直されたほうが良いと思います。 こちらはどういう意味でしょうか。 閉じる処理のことでしょうか。
mskRR

2020/10/18 07:35 編集

self.view.backgroundColor = UIColor.blue Storyboardのself.viewの設定項目にbackgroundがないんでしょうか? セグエ 「あまり理解していない人が初心者向けに丁寧な記事を書いて、おかしなやり方を広めてしまっていることもあります。」=> https://teratail.com/questions/296588#reply-419030 元のviewController → 遷移元のviewController
sunglass

2020/10/18 07:42

> self.view.backgroundColor = UIColor.blue これだと背景色確かに変わります。 ただopacityを設定すると黒い色が残った色になってしまいます。。 (なので追加コード①にしても真っ黒のままです。。赤にすれば赤黒になります。) >Storyboardのself.viewの設定項目にbackgroundがないんでしょうか? あります。 白色に設定しても赤色に設定しても効きません。。 > セグエ こちらの記事さっき読みました。 コピペしていたので詳細確認していなかったです。。 ここもう少し教えてください。 閉じる処理ではなく、前画面からの遷移のことでしょうか。。 Presentationは実際はFull screenにしております。 セグエは確認する限りだと前画面→メニューのみとなっております。 その他にも実際のコードは色々な処理を書いています。 背景色が黒くなる原因に関して必要であれば追記いたします。
mskRR

2020/10/18 08:02

上にあるviewControllerの背景色を透明にしているのだから、modal遷移なら遷移元のviewControllerが見えるはずで、その色が黒なんじゃないですかとずっと言ってます。 self.view.backgroundColor = .blue とstoryboardのviewのbackgroundColorは同じ設定項目なので、時間的に新しい方で上書きされます。 セグエの件はそれで戻ってきてないなら気にしないでください。
sunglass

2020/10/18 08:22

>上にあるviewController こちらはMenuViewControllerのことでしょうか? 現在MenuViewControllerの背景色は白色でAlpha:1.0に変更しています。(質問投稿時と変更しています。背景色を確認するためです。) それでも背景色は黒色になります、、、 (Aplpha:1.0なので透過はしていないはずです。) >modal遷移なら遷移元のviewControllerが見えるはずで、その色が黒なんじゃないですかとずっと言ってます。 遷移元のBackgroundColorはSystem BackGroundColorでAlpha:1.0となっています。 コンテンツもUItableView(セルの色も白)で黒っぽくないです、、 回答内容間違えていましたらすいません、、
sunglass

2020/10/18 08:34

すいません、、 回答内容一部修正します。 > もとのviewControllerの背景色が黒なんじゃないですか? こちら回答時点で『もとの』を見逃していました。。 現在は『もとの』ViewControllerにも self.view.backgroundColor = UIColor.white を設定していますが結果は変わらずでした。。
sunglass

2020/10/18 08:37

あと遷移元のViewControllerにはNavigationControllerがあります。 こちらが原因でしょうか。。 画像追加しますが確かに『もとの』ViewControllerの上部には黒っぽい背景見えます。。
mskRR

2020/10/18 08:42

そちらの環境はわかりませんので回答はできません。 ご自分でviewControllerを2枚用意し、例えば赤のViewControllerから透明のViewControllerにモーダル遷移するサンプルを作られてはどうでしょうか?それができたら透明なViewControllerに青のViewを載せて遷移して、それができたらNavigationControllerをつけて....一つ一つ検証されてはみては?
sunglass

2020/10/18 09:00

はい。 とりあえず 1. 赤のViewControllerから透明のViewControllerにモーダル遷移するサンプル作成 2. 透明なViewControllerに青のViewを載せて遷移 3. NavigationControllerを追加で実装 をやって確認してみます。
sunglass

2020/10/18 12:39 編集

確認しました! 原因というか黒色の解決方法はわかりました。。 (黒色はViewControllerのデフォルトの背景色っぽいです。) (実際のアプリの)解決策としては最後のコメントにあった物のを応用しました。 ベースのViewの背景色を白に設定。 それを透過。(例:Alpha 0.5) このやり方で合っていますでしょうか。
guest

回答1

0

ベストアンサー

modalPresentationStyle.fullScreen にしているのであれば、遷移先で表示された View の Opacity をゼロにしたとしても、遷移元の View は見ることができません。

公式ドキュメントを見ればわかりますが、

The views belonging to the presenting view controller are removed after the presentation completes.

と記述してありますので、.fullscreen の場合は、プレゼンテーション(画面遷移)が完了すると、遷移元の View Controller は View Hierarchy から削除されるようになっています

おそらく、記事が書かれた2年前は View Hierarchy に遷移元が残っていたのだと思いますが、iOS13 対応後、現在の仕様に変わったのだとおもいます。

公式ではありませんが、こういう記事も見つけました。

実際、メニューを表示したあとに View Hierarchy を見てみると(Debug View Hierarchy)

イメージ説明

呼び出し元が View Hierarchy から削除されているのを確かめることができます。

これが原因で、透明度をいくら変更しても遷移元の View Controller が見えていないものと思われます。

解決策はいくつかあるのですが、簡単なのは Presentation を .overFullScreen にすれば解決すると思います(一応、手元の環境だと解決しています)。

StoryBoard だと Segue の設定で

  • Kind -> Present Modally
  • Presentation -> Over Full Screen
  • Transition -> Cross Dissolve

といった感じに設定することになります。

公式ドキュメントをみても

The views beneath the presented content are not removed from the view hierarchy when the presentation finishes. So if the presented view controller does not fill the screen with opaque content, the underlying content shows through.

上記の通り、「画面遷移が終了しても、現在表示しているコンテンツの下にある View は View Hierarchy から削除されない。表示する View Controller が不透明なコンテンツで全画面表示しない場合(訳注:つまり、透明なコンテンツが存在する場合)、配下のコンテンツが見える(ようになっている)」とありますので、これを使うのがいいのではないでしょうか。

ちなみに、.overFullScreen で遷移先を全画面表示させた場合でも、View Hierarchy をみると呼び出し元の View Controller が残っているのが確認できます。

イメージ説明

投稿2020/10/18 13:22

TsukubaDepot

総合スコア5086

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

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

sunglass

2020/10/18 17:04

すごいです、、 めちゃくちゃわかりやすいです!! (ドキュメントの翻訳まで、、ありがとうございます。。) 『View Hierarchy』初めて知りました。 めちゃくちゃ知りたかったです。 Viewをいくら透過しても遷移元のViewが出ないのはそもそもMenuViewで読んだ時点でViewが削除 or 破棄されているのでは?と思ったのですがどう調べて良いのかわからず迷子になっていました。。 ここまで丁寧に解説してくださって本当にありがとうございます。。 めちゃくちゃ助かりました????‍♂️????‍♂️
TsukubaDepot

2020/10/19 00:10

reeebock さんもご指摘されていますが、あとは現象を一つひとつ分解し、逐一確認していくのがいいのではないでしょうか。
sunglass

2020/10/19 04:39

はい。 もう少し自分で分解できるように努力します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問