More ビュー コントローラー (ナビゲーション バー) の存在により、UIView がその高さだけ押し下げられることはわかっています。また、この高さは 44 ピクセルであることもわかっています。また、この押し下げによって が維持されることもわかりました[self.view].frame.origin.y = 0
。
では、このナビゲーション バーの高さを定数に設定する以外に、どのように決定すればよいのでしょうか?
または、もっと簡単に言うと、UIView がナビゲーション バーを上にして表示されているかどうかをどのように判断すればよいでしょうか?
電球が点灯し始めました。残念ながら、以下に説明するように、この問題を修正する統一された方法は見つかりませんでした。
私の問題はすべて autoresizingMasks に集中していると思います。そして、私がそう結論付けた理由は、UIWebView の有無にかかわらず、同じ症状が存在するからです。そして、その症状は、ポートレートではすべて問題がないことです。ランドスケープでは、一番下の UIButton が TabBar の後ろにポップアップします。
たとえば、ある UIView では、上から下に次のようになります。
UIView – 両方のスプリングが設定され(デフォルト)、ストラットは設定されていない
UIScrollView - 2 つのスプリングを設定し、その他すべて (UIView など) をクリアすると、UIButton がそのすぐ上のオブジェクトに干渉します。すべてをクリアすると、UIButton は正常ですが、一番上にあるものは StatusBar の後ろに隠れます。上部の支柱のみを設定すると、UIButton はタブ バーの後ろにポップアップします。
UILabel と UIImage を垂直に並べる – 上部の支柱を設定、その他の部分は柔軟にする
UIWebView を持つ少数の例を補足すると、次のようになります。
UIWebView - Struts: 上、左、右、Springs: 両方
UIButton – 何も設定されていない、つまりどこでも柔軟
電球は暗いですが、希望はあるようです。
短い返信コメントには、提供されているスペースよりも多くのスペースが必要でしたので、ご容赦ください。
私が本当に探しているものを理解しようとしてくださりありがとうございます...それでは始めましょう。
1) 各 UIViewController (TabBar アプリ) には、UIImage、テキスト、その他の要素が上部にあります。もう 1 つの共通点は、下部の UIButton です。一部の UIViewController では、UIButton の上に UIWebView があります。
つまり、UIImage、テキストなど。UIWebView(一部)UIButton
上記すべてを囲むのが UIScrollView です。
2) UIWebView がある場合、autoresizingMask は次のようになります。
—
|
—
^
|
|
|—| ←----→ |—| | | V UIButtonのマスクには何も設定されていない、つまりどこでも柔軟である
-viewDidLoad 内で、-repositionSubViews を呼び出し、その中で次の操作を実行します。
UIWebView がない場合は、IB で配置した UIButton を中央に配置する以外は何もしません。
UIWebView がある場合は、その *content*Height を決定し、コンテンツ全体を囲むようにフレームを設定します。
UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject];
webViewContentHeight = scrollViewInsideWebView.contentSize.height;
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY,
sameWholeViewScrollerWidth, webViewContentHeight)]
これを実行したら、プログラムで UIButton を押し下げて、UIWebView の下に配置されるようにします。
縦向きから横向きに回転するまではすべて正常に動作します。
-didRotateFromInterfaceOrientation 内で -repositionSubViews を呼び出します。
UIWebView のコンテンツの高さが回転しても変わらないのはなぜですか?
縦向きから横向きにすると、コンテンツの幅が拡大し、コンテンツの高さが縮小するはずです。視覚的にはそのとおりになりますが、私の NSLog によるとそうではありません。
とにかく、UIWebView の有無にかかわらず、私が説明したボタンは、ランドスケープ モードでは TabBar の下に移動しますが、上方にスクロールして表示されません。「激しく」スクロールすると、TabBar の後ろに表示されますが、その後、TabBar の後ろに「戻ります」。
要するに、この最後の理由が、TabBar と NavigationBar の高さについて質問した理由です。TabBar は UIView の下部に配置され、NavigationBar は UIView を押し下げるからです。
ここで、先ほどは意味がわからなかったコメントを 1 つか 2 つ追加します。
UIWebView がないので、IB から見たすべてをそのままにしておきます。
UIWebView では、UIWebView の frame.height を contentHeight まで増やし、すべてのサブビューを囲む周囲の UIScrollView の高さも上方に調整します。
まあ、そこにあります。
ベストアンサー1
こんなことしてみませんか?
NSLog(@"Navframe Height=%f",
self.navigationController.navigationBar.frame.size.height);
迅速なバージョンはここにある
アップデート
iOS13 アップデート
statusBarFrame
は で非推奨になったため、iOS13
以下を使用できます。
extension UIViewController {
/**
* Height of status bar + navigation bar (if navigation bar exist)
*/
var topbarHeight: CGFloat {
return (view.window?.windowScene?.statusBarManager?.statusBarFrame.height ?? 0.0) +
(self.navigationController?.navigationBar.frame.height ?? 0.0)
}
}