76

さらに多くのビューコントローラ(ナビゲーションバー)が存在すると、その高さだけUIViewがプッシュダウンされることがわかりました。私はまた、この高さ= 44pxを知っています。私はまた、このプッシュダウンが[self.view].frame.origin.y = 0を維持していることも発見しました。プログラムでナビゲーションバーの高さを取得する

このナビゲーションバーの高さは、定数に設定する以外にどのように決定しますか?

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


電球が点灯し始めました。残念ながら、私は、以下で説明するように、問題を解決するための一貫した方法を発見していません。

私の問題は私の自動サイズ調整の中心にあると私は信じています。私が結論した理由は、UIWebViewの有無にかかわらず同じ症状が存在するからです。そしてその症状は、すべてがポートレートのためにピーチであるということです。ランドスケープの場合、一番下のUIButtonがTabBarの後ろにポップダウンします。

例えば、一つのUIViewに、私は上から下へ、持っている:

のUIView - 私は2つのバネを設定した場合、クリア - の両方を設定ばね(デフォルトの場合)と無支柱

UIScrollViewの他のすべて(UIViewのような)、UIButtonはそのすぐ上のオブジェクトに侵入します。私がすべてをクリアすると、UIButtonはOKですが、一番上のものはStatusBarの背後に隠れます。上のストラットのみを設定すると、UIButtonがタブバーの後ろにポップダウンします。

次の垂直UILabelとUIImage - 柔軟な他の場所のトップ・ストラットセット、

だけのUIWebView持っているいくつかのために絵を完成させる: - :左上、右スプリングス:

のUIWebViewをStrutsの両方

UIButton - すなわち、柔軟どこでも

設定何も、私の電球が暗いですが、希望があるように思われます。


私は短い返信のコメントのために提供されたものより多くの部屋が必要だったので、私に同行してください。

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

1)各UIViewController(TabBarアプリケーション)にはUIImage、テキストなどがあります。別の共通点は、底面のUIButtonです。 UIViewControllerの中には、UIButtonの上にUIWebViewがあります。

ので、UIImage、テキストなどのUIWebView(SOME上)上記のすべての周辺UIButton

はUIScrollViewのです。| - |

— 
    | 
    — 

^
    | 
    | 

2)のUIWebViewを有するものについては、そのautoresizingMaskは次のようになります←----→| - | | | V はUIButtonのマスクは私の-viewDidLoad内すなわち、柔軟どこでも

、設定は何もしています、私は次の操作を行い、その中に私-repositionSubViewsを呼び出す:

全くのUIWebViewがない場合、私はセンター以外何もしませんIBと一緒に配置したUIButton。

私はUIWebViewを持っている場合、私はそのコンテンツ*高さを決定し、コンテンツ全体を囲むようにフレームを設定します。

UIScrollView *scrollViewInsideWebView = [[webView_ subviews] lastObject]; 
webViewContentHeight = scrollViewInsideWebView.contentSize.height; 
[webView_ setFrame:CGRectMake(webViewOriginX, webViewOriginY, 
          sameWholeViewScrollerWidth, webViewContentHeight)] 

これを実行すると、プログラムによってUIButtonがプッシュダウンされ、UIWebViewの下に配置されます。

すべての機能は、縦から横に回転させるまで機能します。

私は、-didRotateFromInterfaceOrientation内でmy -repositionSubViewsを呼び出します。

私のUIWebViewのコンテンツの高さは、回転すると変化しません。なぜですか?

[ポートレート]から[風景]まで、コンテンツの幅は拡大され、コンテンツの高さは縮小されます。それは視覚的にはそうするべきですが、私のNSLogによるとは限りません。

とにかく、UIWebViewの有無にかかわらず、私が話したボタンは、風景モードではTabBarの下に移動しますが、スクロールして表示されません。私は "激しく"スクロールするとTabBarの後ろに表示されますが、TabBarの後ろには "戻る"と表示されます。

最後の理由は、私がTabBarとNavigationBarの高さについて質問したのは、TabBarがUIViewの下部にあり、NavigationBarがUIViewを押し下げるためです。

ここでは、コメントを先に作成していないため、コメントを2つ追加します。

UIWebViewを使用しない場合、私はIBのようにすべてそのまま残します。

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

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

答えて

1

です。残念ながら、私は、以下で説明するように、問題を解決するための一貫した方法を発見していません。

私の問題は私の自動サイズ調整の中心にあると私は信じています。私が結論した理由は、UIWebViewの有無にかかわらず同じ症状が存在するからです。そしてその症状は、すべてがポートレートのためにピーチであるということです。ランドスケープの場合、一番下のUIButtonがTabBarの後ろにポップダウンします。

例えば、一つのUIViewに、私は上から下へ、持っている:

のUIView - の両方を設定ばね(デフォルトの場合)と無支柱

UIScrollViewの - Iが設定されている場合(UIViewのような)他のすべてをクリアすると、UIButtonはそのすぐ上のオブジェクトに侵入します。 すべてをクリアした場合、UIButtonはOKですが、ステータスバーの背後には非常に上のものが隠れています トップストラットのみを設定すると、UIButtonがタブバーの後ろにポップダウンします。

次の垂直UILabelとUIImage - 柔軟な他の場所のトップ・ストラットセット、

だけのUIWebViewを持っているいくつかのために絵を完成させる:

のUIWebView - のStruts:上、左、右 スプリングス:両方

UIButton - 設定は何も、すなわち、柔軟どこでも

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

+0

トップストラットをセットし、UIWebView - 問題解決し、おかげで束ねる。実際、私の残っている唯一の問題は、それらの呪われた@ 2Xなどのグラフィックをデザインすることです。私は非常に簡単な方法でGraphicConverterを使用し、Webページの設計にはうまくいきます。しかし、これらのすべての30px、57pxのもの - 私は、少なくとも私にとっては未知の領域に入っています。 –

204

このような操作を行いますか?

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

迅速なバージョンは、電球が上に来て始めlocated here

+0

ありがとう、ありがとう。しかし、あなたはその問題を解決したので、NavigationController(別名、MoreViewController)が私のタブバーアプリケーションに表示されているかどうかをどうやって判断するのですか? –

+0

私はあなたが言うことをかなり得ていません。 MoreViewControllerが表示されているかどうか確認しようとしていますか? (もしそうなら、あなたは何をしたいのですか?)そうでなければ、正確に何を意味するのか明確にすることができますか? – Sum

+0

あなたの質問をもう一度読みましたが、私はあなたがしたいことをまだ理解していませんでしたか?ビューが表示されたときに何かしたい場合は、コードをviewDidAppearに挿入する必要があります。あなたが少し明確にすると、あなたがしたいことを理解しやすくなります。 – Sum

1

は、あなたの更新に私の応答の始まりです:

なぜ私のUIWebViewの内容の高さは、回転に変更されません?。

あなたの自動サイズ変更にはすべての方向の自動サイズ変更マスクがないことがありますか?

私がこれに戻ってくる前にもう一度提案すると、必要に応じてツールバーを使用できますか?それはちょっとシンプルで、常にボトムになるでしょう、自動回転/ポジション。あなたは自由にそれを表示/非表示することができます。このような種類:http://cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

あなたはそのオプションを見ているかもしれませんが、そこに投げてください。

もう1つの考え方は、回転している方向を検出して、ボタンをプログラムによって配置してタブバーを調整するだけかもしれません。 (これはコードで可能である)

+0

これに取り組んだ約2週間後、UIWebViewサブビューの下にUIButtonを配置することで、「問題」がより難しくなったと判断しました。だから、私はそれの上にボタンを置く。まさに率直に言って、それはちょうど「正しい」ようには見えませんが、今はSORT OFで動作します。下または上にUIWebViewは上の支柱と水平の春だけを設定しました。 BTWは、回転すると変化しないUIWebViewのcontentHeightです。 –

50

スウィフトバージョン:

let navigationBarHeight: CGFloat = self.navigationController!.navigationBar.frame.height 
3
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; 
4

であるあなたはこれを試していましたか?

let barHeight = self.navigationController?.navigationBar.frame.height ?? 0 
4

iPhone-Xでは、トップバー(ナビゲーションバー+ステータスバー)の高さが変更(増加)されています。

あなたがトップバー(両方のナビゲーションバー+のステータスバー)の正確な高さが必要な場合は、これを試してみてください:

のObjective-C

CGFloat topbarHeight = ([UIApplication sharedApplication].statusBarFrame.size.height + 
     (self.navigationController.navigationBar.frame.size.height ?: 0.0)); 

スウィフト4

let topBarHeight = UIApplication.shared.statusBarFrame.size.height + 
     (self.navigationController?.navigationBar.frame.height ?? 0.0) 

簡単に、このUIViewControllerエクステンションを試してください

extension UIViewController { 

    /** 
    * Height of status bar + navigation bar (if navigation bar exist) 
    */ 

    var topbarHeight: CGFloat { 
     return UIApplication.shared.statusBarFrame.size.height + 
      (self.navigationController?.navigationBar.frame.height ?? 0.0) 
    } 
} 

スウィフト3

let topBarHeight = UIApplication.sharedApplication().statusBarFrame.size.height + 
(self.navigationController?.navigationBar.frame.height ?? 0.0) 
関連する問題