UIImagePickerController取消后屏幕大小错误

8

我有一个类似于WhatsApp的iOS应用程序,当我使用UIImagePickerControllerSourceTypeCamera源类型呈现UIImagePickerController时。

imagePicker = [UIImagePickerController new];
imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
imagePicker.delegate = self;
imagePicker.mediaTypes =[NSArray arrayWithObjects:(NSString *)kUTTypeMovie,(NSString *)kUTTypeImage,nil];
[self presentViewController:imagePicker animated:YES completion:nil];

问题

有时在取消或完成使用UIImagePickerController的视频模式后,当我返回到我的视图控制器(关闭相机)时,我的输入视图(我的窗口)会向下移动20像素(状态栏高度),我认为我的问题与此链接相关:如何在通话期间将视图定位在绿色条以下?,因为在视频片段中,录制状态栏会显示一段时间。 在某些情况下,我的窗口(前一个控制器中的UITabbar也会向下移动)!!!

enter image description here

编辑

该解决方案仅适用于当前视图,但另一个视图控制器会出现错误(向下移动)


最好是发布你的代码和你已经尝试过的,这样别人才能帮助你。 - Bharat
@Bharat请再检查一下,(我认为这很正常),我不是n00b :-/ - Mo Farhand
3个回答

5

终于修复了

特别感谢danialzahid94。

要修复此问题,您应该调用:

[self dismissViewControllerAnimated:YES completion:^{
        self.view.frame = [[UIScreen mainScreen]bounds];
        [self.view layoutIfNeeded];
        self.tabBarController.view.frame  = [[UIScreen mainScreen]bounds];
        [self.tabBarController.view layoutIfNeeded]; // for fixing  tabbar Controller 

    }];

在2个委托方法中:

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info


1
好的,我不知道整个视图控制器层次结构会受到干扰。下次我会记住这一点。 - danialzahid94
我在 iOS 13 中首次看到这个 bug。这个解决方案修复了它,谢谢! - Accid Bright

1
如果您正在使用自动布局,当UIImagePickerController关闭时,您可以尝试使用self.view.layoutIfNeeded()。如果这不起作用,您可以获取屏幕大小并将其分配给self.view.frame,如下所示:
self.view.frame = UIScreen.mainScreen().bounds

这通常对我有效。

我的项目是自动布局。我现在要尝试它。让我通知一下。我想说一句话:在关闭相机后(一个小状态栏以红色出现一秒钟(类似于呼叫状态栏),我认为这可能是问题的原因。 - Mo Farhand
是的,在那个块中你会调用它。在调用 layoutIfNeeded 之前添加 self.view.frame = [[UIScreen mainScreen] bounds] - danialzahid94
我认为只有self.view.frame = [[UIScreen mainScreen] bounds]就足够了,让我来通知最终结果 :) - Mo Farhand
是的,没问题兄弟,我会在imagePickerController:didFinishPickingMediaWithInfo:中添加这两行代码。 - Mo Farhand
1
你应该添加 layoutIfNeeded。 - danialzahid94
显示剩余5条评论

0

当我应用了@Mohamad的解决方案后,在更新框架后,当我点击textView时,键盘上方会显示一个空白黑色区域,当我从控制器返回时,Tabbar会向下移动,因此我实现了以下代码是永久解决方案

@property CGRect viewFrame;
@property CGRect tabbarFrame;

- (void)viewWillAppear:(BOOL)animated {
if (CGRectIsEmpty(self.viewFrame)) {
        self.viewFrame=self.view.frame;
        self.tabbarFrame=self.tabBarController.view.frame;
    }
}
- (void)viewDidAppear:(BOOL)animated {
 [self correctScreenSize];
}
-(void)correctScreenSize
{
    self.view.frame = self.viewFrame;
    [self.view layoutIfNeeded];
    self.tabBarController.view.frame  = self.tabbarFrame;
    [self.tabBarController.view layoutIfNeeded];

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接