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

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

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

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

1665閲覧

presentで追加したmodalPresentationStyle = .pageSheetの表示領域の高さの取得方法

mimizuku123

総合スコア12

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2020/11/01 18:51

編集2020/11/02 17:46

前提・実現したいこと

FirstViewControllerにモーダル形式でSecondViewControllerを表示させようとしています。

SecondViewControllerは
modalPresentationStyle = .pageSheetの表示形式で追加し、
表示範囲の下限ギリギリのところにviewを配置したいのですが、
SecondViewControllerの表示領域の高さの取得方法が分からず、
toolbar.frameのYが設定出来ず困っております。

下記図の青色の線、または黄色の線の高さはどのように取得する方法すればよろしいでしょうか?
初心者の質問で申し訳ないのですが、ご教授いただけると幸いです。
(図は、記載したソースコードを実行したものに、
イメージを分かりやすくするために↕︎と注釈を追記したものです。)

イメージ説明

該当のソースコード

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 let btn = UIButton() 9 btn.frame = CGRect(x:0,y:0,width:100,height:100) 10 btn.backgroundColor = .green 11 btn.addTarget(self, action: #selector(btn_tapped), for: .touchUpInside) 12 self.view.addSubview(btn) 13 print("シミュレーターの画面の高さ", self.view.frame.height) 14 } 15 16 @objc func btn_tapped(){ 17 let secondVC = SecondViewController() 18 secondVC.view.backgroundColor = .white 19 secondVC.modalPresentationStyle = .pageSheet 20 self.present(secondVC, animated: true, completion: nil) 21 } 22 23} 24 25//--------------------------------------------------------------- 26 27class SecondViewController:UIViewController { 28 29 let footerView = UIView() 30 31 override func viewDidLoad() { 32 let viewHei:CGFloat = 44 33 footerView.frame = CGRect(x: 0, y: self.view.frame.size.height - viewHei, 34 width: self.view.frame.size.width, height: viewHei) 35 footerView.backgroundColor = .red 36 self.view.addSubview(footerView) 37 38 viewHeiGet() 39 } 40 41 func viewHeiGet(){ 42 print("test1 (狙い:図の青色の線の長さ)", self.view.frame.height) 43 print("test2 (狙い:図の黄色の線の長さ)", self.view.frame.minY) 44 } 45 46}

試したこと

各print()の結果

シミュレーターの画面の高さ 568.0
test1 (狙い:図の青色の線の長さ) 568.0
test2 (狙い:図の黄色の線の長さ) 0.0

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

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

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

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

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

TsukubaDepot

2020/11/02 00:03

ご質問に載せられるコードは、メソッド名や引数ラベルについて、かなり多くの間違いがあります(大文字小文字の間違い、綴り間違いなど)。 コピーして実行しようとしてもエラーばかりで実行すらできません。 コードを転載されるのであれば、Xcode からコピーしてきてそのまま貼り付けて頂けないでしょうか。
mimizuku123

2020/11/02 17:42

大変失礼しました。 修正いたしましたのでご確認いただけると幸いです。
guest

回答2

0

ベストアンサー

viewDidLoad() を実行した時点では、その名の通りただ単に view を読み込んだだけなので、画面上に表示されるサイズは適切に取得することができません。

表示後の予想サイズを取得するのであれば、viewWillAppear(_:) など、実際に画面サイズを調整するときに使うようなメソッドをオーバーライドして使う必要があります。

たとえば、このような感じに書き換えるとお望みの結果になるのではないでしょうか。

Swift

1class SecondViewController:UIViewController { 2 3 let footerView = UIView() 4 5 override func viewDidLoad() { 6 self.view.addSubview(footerView) 7 print(#function) 8 viewHeiGet() 9 } 10 11 override func viewWillAppear(_ animated: Bool) { 12 super.viewWillAppear(animated) 13 14 print(#function) 15 viewHeiGet() 16 17 let viewHei:CGFloat = 44 18 footerView.frame = CGRect(x: 0, y: self.view.frame.size.height - viewHei, 19 width: self.view.frame.size.width, height: viewHei) 20 footerView.backgroundColor = .red 21 } 22 23 func viewHeiGet(){ 24 let viewHeight = self.view.frame.height 25 let deviceHeight = UIScreen.main.bounds.height 26 print("test0 (端末のデバイス高さ)", deviceHeight) 27 print("test1 (狙い:図の青色の線の長さ)", viewHeight) 28 print("test2 (狙い:図の黄色の線の長さ)", deviceHeight - viewHeight) 29 } 30}

投稿2020/11/02 22:06

TsukubaDepot

総合スコア5086

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

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

mimizuku123

2020/11/03 10:46

ありがとうございます! 思ったとおりのものができました
guest

0

SecondViewControllerの表示領域の高さの取得方法が分からず、

toolbar.frameのYが設定出来ず困っております。
SecondViewControllerの表示範囲はどのように取得すればよろしいでしょうか?

質問を理解しきれているか自信がないのですが、以下の回答でいかがでしょうか?

コードを拝見する限り、SecondViewControllerには以下2つのViewが存在しています。

1. SecondViewControllerが持っているView(端末のframeサイズで、背景がwhite) 2. 1のViewにaddSubViewされたView (frameはviewDidLoadで設定している通りで、背景はred)

func viewHeiGet()でprintしているのは上記1のViewのframeになります。
なので、出力結果は問題ないようにみえます。

もし、上記2のViewのframeを取得したいのであれば、以下のようにコードを修正してみてください。

class SecondViewController:UIViewController { let footerView = UIView() // viewという名前だと名前がコンフリクトするので改名してます override func viewDidLoad() { // let view = UIView() // viewDidLoad以外でも参照できるように、メンバ変数として持ちます。こちらは削除 let viewHei = 44 footerView.frame = CGRect(x:0, y: Int(self.view.frame.size.height) - viewHei, width:Int(self.view.frame.size.width), height:viewHei) footerView.backgroundColor = .red self.view.addSubview(footerView) viewHeiGet() } func viewHeiGet(){ // 1のView frame print(self.view.frame.height) print(self.view.bound.height) print(self.view.frame.minY) print(self.view.bound.minY) // 2のView frame print(self.footerView.frame.height) print(self.footerView.frame.minY) print(self.footerView.frame.maxY) } }

投稿2020/11/02 04:22

ichi888

総合スコア81

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

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

mimizuku123

2020/11/02 18:06

ご回答いただき、ありがとうございます。 また、うまく質問ができず、誤解を与えてしまい申し訳ありません。 初心者のため、正しく言語化できないため イメージ図を追加させていただきましたので、ご確認いただけると幸いです。 さて、自分が取得したい高さについてですが、 1.のview frameの内、実際に画面に表示されている範囲の高さを取得したいと思っています。 (イメージ図 青色の線の長さ) modalPresentationStyle = .pageSheetの仕様上、 画面のyが0の場所では無く少し下の部分に追加されるので、 一部、非表示の箇所があります。 そのため、footerViewの大半の部分が非表示の箇所に入ってしまい、隠れてしまうのを修正し、 表示範囲の最下部から高さ44のfooterViewを追加したいのですが、 1.viewの表示範囲の高さがわからず、対応ができません。 そのため、1のviewの表示範囲の高さ(イメージ図 青色の線の長さ) または、secondViewControllerの追加された位置の高さ(イメージ図 黄色の線の長さ) を取得する方法をご教授いただきたい。 というのが質問内容です。 うまく質問できず、誤解を招き申し訳ありません。 ご教示いただけると幸いです。
mimizuku123

2020/11/03 10:46 編集

「コメントを修正しました。」
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問