但是,当将同一个视图控制器嵌入到导航视图控制器中时,下方的背景图像可以被模糊处理,这也是我的意图。
为什么会出现这两种不同的结果?如何使第一种方法中的状态栏变得模糊?
谢谢!
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
我知道这是旧内容,仅供参考,我通过设置self.navigationController.navigationBar.clipToBounds = NO
来解决了这个问题。
我还没有完全测试过这个方法,但是请打开您的plist文件并检查以下设置:
"View controller-based status bar appearance":如果设置为"Yes",则应该显示一个独特于每个视图控制器的状态栏,这可能是您需要的。
"Status bar style":您可以将其设置为三种不同的样式:不透明黑色、灰色和透明黑色。
如果这个方法对您有用,请告诉我。
我有一个类似的UI设计,基于Matt Hall answer和一些文章 我在谷歌上搜索后得出了以下内容:
- (void)viewDidLoad {
[super viewDidLoad];
if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
CGRect statusBarFrame = [self.view convertRect: [UIApplication sharedApplication].statusBarFrame fromView: nil];
UIToolbar *statusBarBackground = [[UIToolbar alloc] initWithFrame: statusBarFrame];
statusBarBackground.barStyle = self.navBar.barStyle;
statusBarBackground.translucent = self.navBar.translucent;
statusBarBackground.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleWidth;
[self.view addSubview: statusBarBackground];
}
}
self.navBar
指向在storyboard中添加的导航栏。只有在运行于iOS7时才需要这样做,这就是为什么我添加了这个条件(我的应用程序必须支持iOS5)。
这个方法非常有效。
- (void)viewDidLoad {
[super viewDidLoad];
if (NSFoundationVersionNumber>NSFoundationVersionNumber_iOS_6_1) {
CGRect statusBarFrame = [self.view convertRect: [UIApplication sharedApplication].statusBarFrame fromView: nil];
self.navBar.frame = CGRectUnion(statusBarFrame, self.navBar.frame);
}
}
UINavigationBar
20
个增量高度UINavigationController将根据一组奇怪而未记录的约束条件来更改其UINavigationBar的高度,高度将为44个点或64个点。如果UINavigationController检测到其视图框架的顶部与其UIWindow的顶部在视觉上连续,则会使用高度为64个点的导航栏进行绘制。如果其视图的顶部与UIWindow的顶部不连续(即使只差一个点),则会以“传统”方式绘制其高度为44个点的导航栏。即使它是应用程序的视图控制器层次结构中的几个子级,UINavigationController也会执行此逻辑。无法阻止此行为。
在第一个示例中,看起来您正在将视图层次结构定位在点(0,20)处。此外,那是UIToolbar还是UINavigationBar?如果是后者,请问为什么要单独使用它而不是在UINavigationController中使用它?
如果您不使用UINavigationController,而是使用自定义视图控制器容器,则需要相应地定位您的视图。
请参见this answer以获取详细说明。
当您使用导航视图控制器嵌入视图控制器时,您将在从同一视图控制器推送到的所有视图控制器中看到导航栏。 在您的第一个案例中,您正在添加导航栏对象,而不是这样做,您可以从故事板中选择视图控制器,转到属性检查器选项卡,然后从中选择顶部栏作为半透明导航栏。