美文网首页ios专题码农的日常之iOS开发
解决在 iPad 的横屏情况下调用相册崩溃的问题

解决在 iPad 的横屏情况下调用相册崩溃的问题

作者: redye | 来源:发表于2015-10-30 15:51 被阅读3771次

在最近的项目中,因为要给设置头像,需要访问到相册,本来觉得这是一个很简单的问题,直接调用 UIImagePickerController 从相册选择照片就可以了,一直以来也是这么做的,,但是以前都是在 iPhone 上实现的,这次是在 iPad 上实现,并且我们的项目是只支持横屏的,所以在条用相册的时候,程序直接就 crash 了,这是让我没有想到的,错误原因是

Supported orientations has no common orientation with the application, and [PUUIAlbumListViewController shouldAutorotate] is returning YES

在网上查阅到的解决办法大都是该 UIImagePickerViewController 添加一个类别,重写它的设备方向的方法,下面是一个 stack overflow 上面的答案

http://stackoverflow.com/questions/12540597/supported-orientations-has-no-common-orientation-with-the-application-and-shoul?lq=1

在程序中我试过这种方法,然而并没有什么用。

同时在这个答案的下面还有另外一种方法,是可以解决程序崩溃的,但是这种呈现的效果,好吧,我不想吐槽 ╮(╯▽╰)╭

将图片的取景框放在当前的视图上,sourceRect 决定放的位置,直接截取了

这种呈现的效果就是想 UIPopoverController 的效果。

但是的但是,这并不是我要的效果,难道就没有其他的解决办法了吗,哦,my god .

被这个问题困扰了挺长一段时间的,但是庆幸,后来还是解决了,先给自己赞一个  (*^__^*)

还是受的 stack overflow 上面的解决办法的启发,既然相册不支持横屏,那就是说在调用相册的时候让设备支持所有方向就好了,当取消相册的时候在让设备又只支持横屏好了,当时只是在调用相册的那个 viewController 中重写设备支持方法,结果自然是没有什么卵用,后来尝试在入口类里重写方法

- (NSUInteger)application:(UIApplication*)application supportedInterfaceOrientationsForWindow:(UIWindow*)window {        returnUIInterfaceOrientationMaskAll;  }

这样自然是可以的,但是这样造成的问题就是,当取消相册的时候,设备并没能切回只支持横屏,到了这一步,能想到的是就是当调用和取消调用相册的时候通知设备应该支持哪些方向,设置头像的 viewController 层次比较深,本来准备使用通知,但是并没有成功,具体的原因有些忘记了,⊙﹏⊙b汗

正在冥思苦想的时候,突然意识到我在项目里有运用到 单例类,就想说我是不是能给单例类一个标识,用来标识是否在调用相册,最后的结果是这样的

实验的结果自然是成功的,切回当前程序的时候,旋转屏幕,并没有发生 UI 离开位置的情况,但使用过程中,还有一个地方不是很好,就是调用相册的时候,相册显示是以竖屏的状态呈现的,用户在使用的时候要先旋转屏幕到竖屏,切回程序的时候又要旋转回横屏,使用起来不是很舒服,最后想到的解决办法是给 UIImagePickerController 指定支持的方向为 横屏方向

总结了一下,每次调用一个 视图控制器 的时候,都会调用指定支持屏幕的方法 - (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window                                       同时在一个视图控制器显示的时候,会调用自己的 支持屏幕方向 supportedInterfaceOrientations 的方法,所以才能在 UIImagePickerController 显示的时候通过指定支持方向来改变 其在用户面前展现的方向。

相关文章

网友评论

  • llllllllIllllIl:如来佛祖玉皇大帝特派取西经使者花果山水帘洞美猴王齐天大圣孙悟空
    llllllllIllllIl:楼主纠结了那么久最后终于走出了五指山娶到了女儿国国王
  • 神游子:谢谢大神
  • Sheldon_WDG:赞一个
  • ab7a7354a02c:感谢楼主,方法很好用,不然调用相册就切换竖屏,体验太差了,这个方法666
  • f819d773bb62:大神,你具体在哪个方法把标识重置的?我在cancel那里重置了 但是不行,而且我写的UIImagePickerController的分类居然不调用 。。已经导入了
    redye:AppDelegate 里面
  • changeWong:我按照你的思路,确实可以实现我想要的功能,但是不知道为什么,测试人员在测试的时候,发现在其他ipad上运行的时候,在浏览照片流的时候,滚动起来特别卡,但是在我自己手上的ipad测试就没有这个问题,我想请教下你,有遇到类似情况吗?
    8afce4bcf1e6:我是横屏的时候,显示UIAlertView,重写了shouldAutorotate方法后,是不会崩溃了,但是UIAlertView却是竖屏的,给 UIAlertView 指定支持的方向为 横屏方向,也还是竖屏,是什么原因呢?
    changeWong:@redye 内存泄漏这个应该不存在我调用这个相册时候吧,就是调用UIImagePickerController打开系统相册而已。
    这是一个按钮点击后调用的方法:
    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.allowsEditing=NO;
    [OrientationManager shareManager].isPhotoLibary = YES;
    [self presentViewController:imagePicker animated:YES completion:NULL];
    redye:看一下内存泄漏的问题。
  • 135d7f3c2206:请问一下,我用的action sheet,在手机上没问题,但是跑到pad上面就是在中间了,如何也能像是在手机上,在下面?
  • 没吃悟饭:还有你的那个 UIImagePickerController 指定支持的方向为 横屏方向的方法是类别吧,好像并没有什么用呢
    redye:@6a657e54717e 使用 UIImagePickerController 的时候导入这个类别试试
  • 没吃悟饭:楼主,我从相册控制权退出来后就变成横竖屏了,用单例也变不回来了,这是什么原因呢
    redye:@6a657e54717e 退出相册的时候,记得给单例的标志位复位
  • cf7e6c591f3b:楼主,现在有个问题就是iPad present ImagePicker 然后 dismiss ImagePicker 重复操作100次,会导致crash 这个有遇到过么?
    redye:@cf7e6c591f3b 没有哇,还有为什么会重复 100 次啊 :sweat:
  • b609b8f59f8a:你的单例类能分享一下吗 怎样判断当前是在调用相册?
    redye:@猿来缘来 这个是用在以前项目中的,demo 倒是没有,你可以在调用相册的时候给单例一个标志位,在 AppDelegate 中根据这个标志位来控制 pad 的屏幕。
  • b609b8f59f8a:我也遇到了这个问题 用了上面的方法解决不了啊
    lyni:@猿来缘来 你好,你的问题解决了吗
  • 奔跑的码农:有具体的demo么
    redye:@奔跑的码农 没有写demo,只是在项目中遇到

本文标题:解决在 iPad 的横屏情况下调用相册崩溃的问题

本文链接:https://www.haomeiwen.com/subject/bbmfhttx.html