iPhone - 以编程方式删除状态栏
Posted
技术标签:
【中文标题】iPhone - 以编程方式删除状态栏【英文标题】:iPhone - Remove status bar programmatically 【发布时间】:2012-04-05 09:40:47 【问题描述】:我制作了一个实现 iPhone 摄像头的应用。 当用户完成选择他们的图像时,状态栏会重新出现! 如何确保状态栏保持隐藏状态?
这是我的代码:
-(IBAction)pickImage:(id)sender
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentModalViewController:picker animated:YES];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
[picker dismissModalViewControllerAnimated:YES];
background.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
如果我做错了什么,请指出! 谢谢, 拉菲
【问题讨论】:
如果您将状态栏设置为最初隐藏在应用程序 info.plist 中,则状态栏将保持隐藏状态。 不,状态栏不会保持隐藏状态。我刚刚对此进行了测试;这似乎是一个错误,对于类型为 UIImagePickerControllerSourceTypeSavedPhotosAlbum 的 UIImagePicker,在dismissModalViewController 上是 100% 可复制的(至少对我而言)。 Camera 和 PhotoLibrary 都不会发生这种情况。 【参考方案1】:[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
如果有的话,您可以选择其他动画样式。
【讨论】:
UIKit 中实际上存在一个错误,OP 正在经历。 完美运行,与 imagePicker 有同样的问题 现在在 ios 9 中已弃用【参考方案2】:在 iOS 7 中,UIViewController 上有一个方法“prefersStatusBarHidden”。要隐藏状态栏,请将此方法添加到您的视图控制器并返回 YES:
- (BOOL) prefersStatusBarHidden
return YES;
【讨论】:
【参考方案3】:在这种情况下,我们使用 2 个步骤
第一步: 添加 info.plist:“查看基于控制器的状态栏外观”,值为“NO”
第二步:通过 UIImagePickerController 的委托使用/调用此代码
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
if([navigationController isKindOfClass:[UIImagePickerController class]])
[[UIApplication sharedApplication] setStatusBarHidden:YES];
【讨论】:
【参考方案4】:在 iOS 7 及更高版本中,您可以使用以下代码来隐藏和取消隐藏状态栏,
@interface ViewController()
@property (nonatomic, getter=isStatusBarHidden) BOOL statusBarHidden;
@end
@implementation ViewController
... other codes
- (BOOL)prefersStatusBarHidden
return self.isStatusBarHidden;
- (UIStatusBarAnimation)preferredStatusBarUpdateAnimation
return UIStatusBarAnimationFade;
- (void)hideStatusBar
self.statusBarHidden = YES;
[self setNeedsStatusBarAppearanceUpdate];
- (void)showStatusBar
self.statusBarHidden = NO;
[self setNeedsStatusBarAppearanceUpdate];
@end
【讨论】:
【参考方案5】:与 UIImagePicker 关联的 UIViewController 的关闭机制中似乎存在错误,sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum。
在调用dismissModalViewController的那一刻(加上有completion的方法:)UIApplication的状态栏hidden属性瞬间从YES变为NO,并且在踩过dismiss的那一刻被绘制...
这对于使用全屏视图的应用程序来说是非常明显的。我当前的应用程序项目确实如此,而且我在呈现之前控制视图控制器视图的框架,因此 UIImagePicker 不是全屏的。这使得错误非常明显。我花了 4-5 个小时确定原因,这是最终确定的结论,并且 sourceType Camera 和 PhotoLibrary 都不会出现该错误。
因此,如果您想要一个完美的全屏应用并希望呈现无错误的 UIImagePicker,请避免使用 UIImagePickerControllerSourceTypeSavedPhotosAlbum
【讨论】:
【参考方案6】:Grand Central Dispatch 是你的朋友,使用这种方法你不会在显示选择器时或之后看到状态栏出现
- (void)hideStatusBar
if ([self respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)])
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
- (BOOL)prefersStatusBarHidden
return YES;
- (void)viewDidAppear:(BOOL)animated
[super viewDidAppear:animated];
[self hideStatusBar];
double delayInSeconds = 0.2;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
[self hideStatusBar];
);
【讨论】:
以上是关于iPhone - 以编程方式删除状态栏的主要内容,如果未能解决你的问题,请参考以下文章
如何设置状态栏或安全区域以删除 iPhone X 上的空白?