【问题标题】:iPhone - Remove status bar programmaticallyiPhone - 以编程方式删除状态栏
【发布时间】: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 都不会发生这种情况。

标签: iphone ios uiimagepickercontroller statusbar


【解决方案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];
              });
          }
          

          【讨论】:

            猜你喜欢
            • 2014-02-20
            • 2013-04-20
            • 1970-01-01
            • 2013-11-24
            • 2015-02-13
            • 2023-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多