解散 UIImagePickerController 会破坏父布局
Posted
技术标签:
【中文标题】解散 UIImagePickerController 会破坏父布局【英文标题】:dismissing UIImagePickerController breaks parent layout 【发布时间】:2013-10-15 10:59:27 【问题描述】:我尝试使用 UIImagePickerController 从 iphone 图库中挑选照片。 在按钮单击时,我执行以下操作:
- (IBAction)attachAction:(id)sender
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
self.imagePicker.allowsEditing = YES;
self.imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:self.imagePicker animated:YES];
在纵向它很好,但是当我旋转到横向时,呈现图像选择器并在做一些工作后将其关闭,父视图控制器的布局中断,我看到一半的屏幕带有父视图,另一半是黑色矩形。
任何想法如何解决这个问题? imagePicker 关闭后如何强制 uiviewcontroller 手动更改布局或方向?
我尝试通过这段代码处理旋转,但没有任何改变
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
- (BOOL)shouldAutorotate
return YES;
-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
[self.view setNeedsLayout];
【问题讨论】:
【参考方案1】:如果您旋转 modalView,当呈现控制器不处理旋转时,就会发生这种情况。
尝试添加
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskPortrait;
在这个类中,它应该在模式视图被关闭时正确替换视图
【讨论】:
什么都没有发生,布局仍然损坏 你是如何在这个控制器中处理旋转的?你能分享这部分代码吗? 我添加了这个方法来处理旋转 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation return YES; 但此方法不会触发 shouldAutorotateToInterfaceOrientation: 应该在 ios6 之前使用,因为 iOS6 有 -(NSUInteger)supportedInterfaceOrientation 和 -(BOOL)shouldAutorotate 我发现了奇怪的行为:supportedInterfaceOrientations 方法只被调用了一次,在创建 VC 时没有更多时间,即使我旋转设备。【参考方案2】:好吧,UIImagePickerController 只支持纵向模式。但是您需要使用以下属性来强制执行横向行为。 @property(非原子,保留) UIView *cameraOverlayView 讨论 您可以使用覆盖视图在默认图像选择器界面的顶部呈现自定义视图层次结构。图像选择器将您的自定义覆盖视图分层放置在其他图像选择器视图之上,并将其相对于屏幕坐标定位。如果您将默认相机控件设置为可见,请将透明度合并到您的视图中,或将其放置以避免遮挡底层内容。
您也可以点击此链接Force landscape orientation in UIImagePickerController
【讨论】:
我有源类型 UIImagePickerControllerSourceTypePhotoLibrary,所以我不能使用这个属性,还是我理解错了?【参考方案3】:我发现了问题。我在这个VC之前有UITabBarController,我忘了实现
- (BOOL)shouldAutorotate
return YES;
- (NSUInteger)supportedInterfaceOrientations
return UIInterfaceOrientationMaskAllButUpsideDown;
子类化 UITabBarController 并添加这些方法解决了问题。感谢您的建议!
【讨论】:
以上是关于解散 UIImagePickerController 会破坏父布局的主要内容,如果未能解决你的问题,请参考以下文章
为啥解散presentingViewController,只解散子控制器?
模态 MPMoviePlayerViewController 以错误的动画解散