148

より多くのView Controller(ナビゲーションバー)が存在すると、UIViewがその高さで押し下げられることを私は知っています。この高さ = 44px であることも知っています。私はまた、このプッシュダウンが[self.view].frame.origin.y = 0.

では、定数に設定する以外に、このナビゲーション バーの高さを決定するにはどうすればよいでしょうか。

または、短いバージョンで、UIView がナビゲーション バーを上にして表示されていることを確認するにはどうすればよいですか?


電球がつき始めました。残念ながら、以下で説明するように、問題を修正するための統一された方法は見つかりませんでした。

私の全体の問題は autoresizingMasks に集中していると思います。そして、UIWebView の有無にかかわらず、同じ症状が存在すると結論付けた理由です。そしてその症状は、Portrait のすべてが桃色であるということです。ランドスケープの場合、一番下の UIButton が TabBar の後ろにポップダウンします。

たとえば、1 つの UIView では、上から下に次のように表示されます。

UIView – スプリング セット (デフォルトのケース) とストラットなしの両方

UIScrollView - 2 つのスプリングを設定し、他のすべて (UIView など) をクリアすると、UIButton がそのすぐ上のオブジェクトに侵入します。すべてをクリアすると、UIButton は問題ありませんが、一番上にあるものは StatusBar の後ろに隠れます 上部ストラットのみを設定すると、UIButton はタブ バーの後ろにポップ ダウンします。

UILabel と UIImage が垂直方向に次 – 上部ストラット セット、その他の場所では柔軟

UIWebView を持っている少数の人の写真を完成させるために:

UIWebView - ストラット: 上、左、右 スプリング: 両方

UIButton – 何も設定されていない、つまりどこでも柔軟

私の電球は薄暗いですが、希望があるようです。


短い返信コメントに提供されたものよりも多くのスペースが必要だったので、ご容赦ください.

私が本当に釣りをしているものを理解しようとしてくれてありがとう...だからここに行きます。

1) 各 UIViewController (TabBar アプリ) には、UIImage、いくつかのテキスト、およびその上にあるものがあります。もう 1 つの共通点は、下部の UIButton です。一部の UIViewControllers では、UIButton の上に UIWebView があります。

だから、UIImage、テキストなど。UIWebView(SOME上)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)]

それができたら、UIWebView の下に配置されるように、プログラムで UIButton を押し下げます。

ポートレートからランドスケープに回転するまで、すべてが機能します。

-didRotateFromInterfaceOrientation 内で -repositionSubViews を呼び出します。

UIWebView のコンテンツの高さが回転しても変わらないのはなぜですか?

縦向きから横向きにすると、コンテンツの幅が拡大し、コンテンツの高さが縮小します。視覚的には正常に機能しますが、私の NSLog によるとそうではありません。

とにかく、UIWebView の有無にかかわらず、私が話したボタンは、Landscape モードのときに TabBar の下に移動しますが、上にスクロールして表示されることはありません。「激しく」スクロールするとTabBarの後ろに表示されますが、TabBarの後ろに「フォールバック」します。

結論として、TabBar は UIView の下部に配置され、NavigationBar は UIView を押し下げるため、TabBar と NavigationBar の高さについて尋ねたのはこの最後の理由です。

ここで、以前は意味をなさなかったので、ここにコメントを 1 つか 2 つ追加します。

UIWebView がないので、IB で見られるようにすべてをそのままにします。

UIWebView を使用して、UIWebView の frame.height を contentHeight に増やし、すべてのサブビューを囲む周囲の UIScrollView の高さを上方に調整します。

さて、あなたはそれを持っています。

4

15 に答える 15

273

このようなことをしますか?

    NSLog(@"Navframe Height=%f",
        self.navigationController.navigationBar.frame.size.height);

迅速なバージョンはここにあります


アップデート

iOS 13

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)
    }
}
于 2011-09-05T19:38:23.217 に答える
63

迅速なバージョン:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height
于 2014-12-14T16:13:13.693 に答える
7

これを試しましたか?

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0
于 2017-01-30T05:57:45.407 に答える
5
UIImage*image = [UIImage imageNamed:@"logo"];

float targetHeight = self.navigationController.navigationBar.frame.size.height;
float logoRatio = image.size.width / image.size.height;
float targetWidth = targetHeight * logoRatio;

UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
// X or Y position can not be manipulated because autolayout handles positions.
//[logoView setFrame:CGRectMake((self.navigationController.navigationBar.frame.size.width - targetWidth) / 2 , (self.navigationController.navigationBar.frame.size.height - targetHeight) / 2 , targetWidth, targetHeight)];
[logoView setFrame:CGRectMake(0, 0, targetWidth, targetHeight)];
self.navigationItem.titleView = logoView;

// How much you pull out the strings and struts, with autolayout, your image will fill the width on navigation bar. So setting only height and content mode is enough/
[logoView setContentMode:UIViewContentModeScaleAspectFit];

/* Autolayout constraints also can not be manipulated since navigation bar has  immutable constraints
self.navigationItem.titleView.translatesAutoresizingMaskIntoConstraints = false;

NSDictionary*metricsArray = @{@"width":[NSNumber numberWithFloat:targetWidth],@"height":[NSNumber numberWithFloat:targetHeight],@"margin":[NSNumber numberWithFloat:20]};
NSDictionary*viewsArray = @{@"titleView":self.navigationItem.titleView};

[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-(>margin=)-H:[titleView(width)]-(>margin=)-|" options:NSLayoutFormatAlignAllCenterX metrics:metricsArray views:viewsArray]];
[self.navigationItem.titleView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[titleView(height)]" options:0 metrics:metricsArray views:viewsArray]];

NSLog(@"%f", self.navigationItem.titleView.width );
*/

したがって、実際に必要なのは

UIImage*image = [UIImage imageNamed:@"logo"];
UIImageView*logoView = [[UIImageView alloc] initWithImage:image];
float targetHeight = self.navigationController.navigationBar.frame.size.height;
[logoView setFrame:CGRectMake(0, 0, 0, targetHeight)];
[logoView setContentMode:UIViewContentModeScaleAspectFit];

self.navigationItem.titleView = logoView;
于 2015-04-08T07:11:52.417 に答える
2

電球がつき始めました。残念ながら、以下で説明するように、問題を修正するための統一された方法は見つかりませんでした。

私の全体の問題は autoresizingMasks に集中していると思います。そして、UIWebView の有無にかかわらず、同じ症状が存在すると結論付けた理由です。そしてその症状は、Portrait のすべてが桃色であるということです。ランドスケープの場合、一番下の UIButton が TabBar の後ろにポップダウンします。

たとえば、1 つの UIView では、上から下に次のように表示されます。

UIView – スプリング セット (デフォルトのケース) とストラットなしの両方

UIScrollView - 2 つのスプリングを設定し、他のすべて (UIView など) をクリアすると、UIButton がそのすぐ上のオブジェクトに侵入します。すべてをクリアすると、UIButton は問題ありませんが、一番上にあるものは StatusBar の後ろに隠れます 上部ストラットのみを設定すると、UIButton はタブ バーの後ろにポップ ダウンします。

UILabel と UIImage が垂直方向に次 – 上部ストラット セット、その他の場所では柔軟

UIWebView を持っている少数の人の写真を完成させるために:

UIWebView - ストラット: 上、左、右 スプリング: 両方

UIButton – 何も設定されていない、つまりどこでも柔軟

私の電球は薄暗いですが、希望があるようです。

于 2011-09-07T13:14:41.057 に答える
1

これがあなたの更新に対する私の応答の始まりです:

UIWebView のコンテンツの高さが回転しても変わらないのはなぜですか?

自動サイズ変更にすべての方向の autoresizingMask がないためでしょうか?

これについて戻ってくる前に、もう 1 つ提案があります。必要に応じてツールバーを使用できますか。それは少し単純で、常に一番下にあり、自動回転/位置になります。自由に非表示/表示することができます.

あなたはそのオプションを見たことがあるかもしれませんが、ただそこに放り込んでいます。

別のアイデアとして、回転している向きを検出し、プログラムでボタンを配置してタブバーを調整することができます。(これはコードで可能です)

于 2011-09-09T05:23:24.660 に答える