【问题标题】:status bar still visible after uipopovercontroller dismisseduipopovercontroller 关闭后状态栏仍然可见
【发布时间】:2026-01-17 03:55:01
【问题描述】:
-(BOOL)prefersStatusBarHidden
{
    return YES;
}

- (IBAction)PhotoImportAction:(id)sender
{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = NO;
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
        [self presentViewController:picker animated:YES completion:nil];
    else
    {
      popover=[[UIPopoverController alloc]initWithContentViewController:picker];
              popover.delegate=self;

        [popover presentPopoverFromRect:PhotoImportButton.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    }


}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    UIImage *selectedImage=info[UIImagePickerControllerOriginalImage];
    VisualEffectImageVIew.image=selectedImage;
    BackgroundImageView.image=selectedImage;
    ForegroundImageView.image=selectedImage;
   if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone)
    {
        [picker dismissViewControllerAnimated:YES completion:nil];
    }
    else
    {

        [popover dismissPopoverAnimated:YES];

  }
}
-(void)viewWillAppear:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];

}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}

上面的代码非常简单,一切正常,除了 viewWillAppear 方法在关闭 UIPopoverController 后在 iPad 上不起作用,所以我们尝试使用 popoverControllerDidDismissPopover 方法但状态栏仍然可见。任何解决方案都值得赞赏。

【问题讨论】:

  • 在 UIImagePickerController 中隐藏状态栏会破坏 swipeBack Navigation *.com/q/29864197/4813721
  • 你确定你的popoverControllerDidDismissPopover:方法被调用了吗?
  • 嗯,我认为你是对的,它没有被调用。

标签: ios xcode ios8.1


【解决方案1】:

在 viewdidload 中添加以下行

[[UIApplication sharedApplication] setStatusBarHidden:YES
                                            withAnimation:UIStatusBarAnimationFade];

并添加新方法

 - (BOOL)prefersStatusBarHidden {
          return YES;
  }

还更改 info.plist 文件查看基于控制器的状态栏外观" = NO

【讨论】:

  • 没用,是的,我们已将状态栏设置为最初隐藏为“是”,并将基于控制器的状态栏设置为“否”。
【解决方案2】:

您没有设置弹出框的代表。请设置它并检查委托方法是否有效...

希望对你有帮助:)

【讨论】:

  • 仔细查看我的代码兄弟我已经使用了它,但它仅适用于 uiimage 选择器控制器,不适用于 uipopovercontroller。
【解决方案3】:

从你的代码中我看到你没有设置 UIPopoverController 的delegate。 添加以下行

 popover.delegate = self

在呈现弹出框之前。希望这行得通。

【讨论】:

  • 已与委托连接,但仍未调用该方法。
  • 确保您的 ViewController 符合 <UIPopoverControllerDelegate> 协议。
  • 包含协议,否则会出错。
  • 我看到你分配的编辑代码popoverCon.delegate=self;图片中没有popoverCon。我认为应该是popover.delegate=self。如果我遗漏了什么,请纠正我。
  • 在你的 popoverviewcontroller 中你调用dismissPopoverAnimated: 方法吗?如果是这种情况,popoverControllerDidDismissPopover: 将不会被调用。这是reference
【解决方案4】:

根据苹果的文档,如果 popoverController 以编程方式关闭,则不会调用方法 popoverControllerDidDismissPopover。您可以手动调用 popoverControllerDidDismissPopover 方法。

[self popoverControllerDidDismissPopover:popoverController];

【讨论】: