在导航控制器中,您会按预期自动获得导航栏的正确颜色和位置。
像这样
但是在模态视图中,当您拖动导航栏时,您可以将其定位在顶部,这与运营商/电池信息太近了。
所以你可以把它往下拖,猜猜它与自动创建的位置匹配多远,但是你有一个颜色差异。我曾尝试更改 IB 中的状态栏设置,但没有任何区别。
有没有正确的方法来克服这个问题,比如使模态视图看起来像自动生成的导航视图。
谢谢
在导航控制器中,您会按预期自动获得导航栏的正确颜色和位置。
像这样
但是在模态视图中,当您拖动导航栏时,您可以将其定位在顶部,这与运营商/电池信息太近了。
所以你可以把它往下拖,猜猜它与自动创建的位置匹配多远,但是你有一个颜色差异。我曾尝试更改 IB 中的状态栏设置,但没有任何区别。
有没有正确的方法来克服这个问题,比如使模态视图看起来像自动生成的导航视图。
谢谢
在 iOS 7 中克服这个问题的最佳方法是遵循新UIBarPositioningDelegate
协议。
您将 NavigationBar 的委托连接到您的视图控制器(通过情节提要或通过代码将您的视图控制器设置为导航栏的委托)并遵守该协议并通过实现该方法
-(UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }
您可以删除视图控制器中的顶部间隙。您需要将条形图放置在顶部边缘下方 20 点处
Figured out the 3 options for solving this problem.
Option 1: Resize the Nav Bar
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
// iOS 7
self.navBar.frame = CGRectMake(self.navBar.frame.origin.x, self.navBar.frame.origin.y, self.navBar.frame.size.width, 64);
}
Option 2: Hide the Status Bar
For example, in the modal view where you want to hide the status bar
Add this method
- (BOOL)prefersStatusBarHidden
{
return YES;
}
In viewDidLoad add
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
else {
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}
Now, when you dismiss the modal view, and you want your status bar back. Add this in viewWillAppear
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
NSLog(@"ios7");
}
else {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}
and this, but return NO this time
- (BOOL)prefersStatusBarHidden
{
return NO;
}
Option 3: Embed in Nav Controller
Select your modal view, just embed that in a Navigation Controller.
在斯威夫特:
在 iOS 8.1 和 Swift 中克服这个问题的最佳方法是遵循新的 UIBarPositioningDelegate 协议。
您将 NavigationBar 的委托连接到您的视图控制器并遵守该协议并通过调用方法:
func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
return UIBarPosition.TopAttached
}
您可以删除视图控制器中的顶部间隙。您需要将条形图放置在顶部边缘下方 20 点处。
对于 Swift3 使用以下..
func position(for bar: UIBarPositioning) -> UIBarPosition{
return .topAttached;
}
在 iOS 7 中几次尝试将导航栏向下移动几个像素之后,这最终对我有用:
-(void)viewWillLayoutSubviews
{
float iosVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) {
// iOS 7+
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += 10;
self.view.frame = viewFrame;
}
}
我还调整了状态栏颜色以更好地匹配我的内容:
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
我创建了一个导航控制器,删除了与它一起出现的“根视图控制器”。然后按住 ctrl 并拖动 View 上的“导航控制器”(删除之前手动添加的导航栏)。将导航控制器设置为“初始视图控制器”,它现在对我来说很好。
isTranslucent
默认设置为true
。将其设置为false
将扩展状态栏下方的导航栏。
navigationBar.isTranslucent = false
我关闭了“使用自动布局”,它对我有用。