获取具有 UINavigationBar 外观的导航栏框架

Posted

技术标签:

【中文标题】获取具有 UINavigationBar 外观的导航栏框架【英文标题】:Get frame of Navigation Bar with UINavigationBar appearance 【发布时间】:2014-04-26 21:19:35 【问题描述】:

抱歉,问题很简单,但代码如下:

[[UINavigationBar appearance] setBackgroundImage:[UIImage
    imageNamed:@"backgroundNavigationBar.png"] forBarMetrics:UIBarMetricsDefault];
CGRect frame = [[UINavigationBar appearance] frame];
NSLog(@"%@", NSStringFromCGRect(frame));
UIView *view = [[UIView alloc] initWithFrame:frame];
[[UINavigationBar appearance] addSubview: view];

给我

0, 0, 0, 0

如何正确获取当前导航栏的实际尺寸,即 320x64 的框架?

【问题讨论】:

【参考方案1】:

试试:

CGRect frame = self.navigationController.navigationBar.frame;

【讨论】:

【参考方案2】:

恐怕您的代码无法按照您希望的方式运行:/

外观代理当然不是用来添加子视图的!

您只能通过 UIAppearance 编辑在头文件中标记为“UI_APPEARANCE_SELECTOR”的属性!

编译器允许您编写代码,因为+ (instancetype)appearance 实际上返回了该类的代理对象。

您要添加子视图的实际视图与该代理没有任何关系。 UIAppearance 查看代理对象,并在创建新视图时仅复制 UI_APPEARANCE_SELECTOR 标记的属性。

请阅读此https://developer.apple.com/library/ios/documentation/uikit/reference/UIAppearance_Protocol/Reference/Reference.html

还有这个http://nshipster.com/uiappearance/ ,它将为您提供如何使用 UIAppearance 的一个很好的概述。

【讨论】:

以上是关于获取具有 UINavigationBar 外观的导航栏框架的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationBar 在 Modal 上的外观未设置

带有 RECurtainViewController 的 UINavigationBar 外观

自定义 UINavigationBar 外观以在 CNContactPickerViewController 中显示

在iOS 11中忽略设置UINavigationBar外观

UINavigationBar 外观 setBackgroundImage 隐藏状态栏

UINavigationbar 通过外观设置阴影不起作用