ios - 以编程方式获取导航栏的高度

我知道更多 View Controller (导航栏)的存在将 UIView 的高度向下推。我也知道这个高度 = 44px。我还发现这种下推保持了 [self.view].frame.origin.y = 0 .

那么我如何确定这个导航栏的高度,而不是仅仅将它设置为一个常数呢?

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

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

我相信我的整个问题都集中在我的 autoresizingMasks 上。我得出结论的原因是存在相同的症状,无论有没有 UIWebView。那个症状是肖像的一切都是桃色的。对于横向,最底部的 UIButton 在 TabBar 后面弹出。

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

UIView - 两个 Spring 组(默认情况)和没有支柱

UIScrollView - 如果我设置了两个 Spring ,并清除了其他所有内容(如 UIView),那么 UIButton 会侵入其正上方的对象。如果我清除所有内容,那么 UIButton 就可以了,但最顶部的东西隐藏在 StatusBar 后面 仅设置顶部支柱,UIButton 会在 Tab Bar 后面弹出。

UILabel 和 UIImage 下一个垂直 - 顶部支柱集,其他任何地方都很灵活

只是为了完成少数拥有 UIWebView 的图片:

UIWebView - Struts:上、左、右 Springs:两者

UIButton – 没有任何设置,即随处灵活

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

请多多包涵,因为我需要比提供简短回复评论更多的空间。

感谢您尝试了解我真正在钓鱼的目的……所以就这样吧。

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

所以,UIImage,文本等 UIWebView(在某些地方) UIButton

围绕上述所有内容的是一个 UIScrollView。

2)对于那些有 UIWebView 的,它的 autoresizingMask 看起来像:

   —
   |
   —

   ^
   |
   |

|—| ←----→ |—|
|
|

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 向下推。

现在,我将在这里添加一两条评论,因为它们之前没有意义。

在没有 UIWebView 的情况下,我保留了 IB 所看到的一切。

使用 UIWebView,我将 UIWebView 的 frame.height 增加到它的 contentHeight 并向上调整围绕所有 subview 的周围 UIScrollView 的高度。

那么你有它。

最佳答案

做这样的事情?

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

快速版本是located here

更新

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)
    }
}

https://stackoverflow.com/questions/7312059/

相关文章:

objective-c - 取消排队的 performSelector :afterDelay ca

ios - 如何在 iOS 7 下更改 UIPickerView 中文本的颜色?

objective-c - 在objective-c中获取NSURL的一部分

ios - 如何使用 Swift 播放本地视频?

ios - 在 iOS 的 UITextView 中检测属性文本的点击

objective-c - 在什么情况下,我们需要在 ARC 下编写 __autoreleasing

ios - 如何自定义分组表格 View 单元格的背景/边框颜色?

ios - UIButton自定义字体垂直对齐

iphone - 如何在 UITableView beginUpdates/endUpdates 上

objective-c - 有没有办法抑制 Xcode 中的警告?