以编程方式获得导航栏的高度

我知道更多的视图控制器(导航栏)的存在按下UIView的高度。 我也知道这个高度= 44px。 我也发现,这下推维持[self.view].frame.origin.y = 0

那么如何确定此导航栏的高度,而不是将其设置为常量?

或者,更短的版本,我如何确定我的UIView显示与顶部的导航栏?


电灯泡开始了。 不幸的是,我没有发现一个统一的方法来纠正这个问题,如下所述。

我相信我的整个问题都集中在我的autoresizingMasks上。 我之所以得出这样的结论,就是存在相同的症状,无论是否有UIWebView。 那症状是肖像的一切都是桃色的。 对于Landscape,最下面的UIButton在TabBar后面popup。

例如,在一个UIView上,我从上到下:

UIView – 两个弹簧设置(默认情况下)和没有支柱

UIScrollView – 如果我设置了两个弹簧,并清除其他所有内容(如UIView),那么UIButton就会侵入它上面的对象。 如果我清除了所有内容,那么UIButton就可以了,但是最上方的东西隐藏在StatusBar的后面。只设置最上面的撑杆,UIButton会在Tab Bar后面popup。

UILabel和UIImage接下来的垂直顶部支柱设置,在其他地方灵活

只是为了完成less数有一个UIWebView的图片:

UIWebView – Struts:顶部,左侧,右侧弹簧:两者

UIButton – 没有设置,即灵活无处不在

虽然我的灯泡很暗淡,但似乎有希望。


请忍受我,因为我需要更多的空间比提供一个简短的回复评论。

感谢您试着了解我真的在为什么而钓鱼…所以在这里。

1)每个UIViewController(一个TabBar应用程序)都有一个UIImage,一些文本和顶部的东西。 另一个共同点是底部的UIButton。 在一些UIViewControllers我有一个UIButton上方的UIWebView。

所以,UIImage,文本等UIWebView(在一些)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中调用了我的-repositionSubViews。

为什么我的UIWebView的内容高度不会随着旋转而改变?

从纵向到横向,内容宽度应扩大,内容高度应缩小。 它确实在视觉上,但不是根据我的NSLog。

无论如何,无论有没有UIWebView,当我在“风景”模式下,我所谈到的button都会在TabBar的下方移动,但不会向上滚动。 当我滚动“有力”时,我在TabBar后面看到它,但是随后在TabBar后面“退后”。

底线,这最后是我问到TabBar和NavigationBar的高度的原因,因为TabBar植物本身在UIView的底部和NavigationBar推下UIView。

现在,我要在这里添加一两个评论,因为他们之前没有意义。

没有UIWebView,我就像IB所看到的一样。

使用UIWebView,我将UIWebView的frame.height增加到它的contentHeight,同时也调整围绕所有子视图的周围UIScrollView的高度。

那么你有它。

做这样的事情?

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

快速版本位于这里

Swift版本:

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

你试过这个吗?

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

电灯泡开始了。 不幸的是,我没有发现一个统一的方法来纠正这个问题,如下所述。

我相信我的整个问题都集中在我的autoresizingMasks上。 我之所以得出这样的结论,就是存在相同的症状,无论是否有UIWebView。 那症状是肖像的一切都是桃色的。 对于Landscape,最下面的UIButton在TabBar后面popup。

例如,在一个UIView上,我从上到下:

UIView – 两个弹簧设置(默认情况下)和没有支柱

UIScrollView – 如果我设置了两个弹簧,并清除其他所有内容(如UIView),那么UIButton就会侵入它上面的对象。 如果我清除了所有内容,那么UIButton就可以了,但是最上方的东西隐藏在StatusBar的后面。只设置最上面的撑杆,UIButton会在Tab Bar后面popup。

UILabel和UIImage接下来的垂直顶部支柱设置,在其他地方灵活

只是为了完成less数有一个UIWebView的图片:

UIWebView – Struts:顶部,左侧,右侧弹簧:两者

UIButton – 没有设置,即灵活无处不在

虽然我的灯泡很暗淡,但似乎有希望。

以下是我对你的更新的回应的开始:

为什么我的UIWebView的内容高度不会随着旋转而改变?

难道是因为你的自动resize没有所有方向的autoresizingMask?

在我回来之前的另一个build议是,你可以使用一个工具栏来满足你的需求。 这是一个简单的,总是在底部,自动旋转/位置。 你可以随意隐藏/显示等。像这样: http : //cdn.artoftheiphone.com/wp-content/uploads/2009/01/yellow-pages-iphone-app-2.jpg

你可能已经看过这个选项,但只是扔在那里。

另一个想法,你可能会检测到你正在旋转什么方向,只需button编程调整标签栏。 (这是可能的代码)