我在iOS 7.1中使用UIDocumentInteractionController并且它的表现非常糟糕。
我在UICollectionViewController中使用它来查看集合视图中的文档。
在集合视图中按下某个项目时,大约需要6秒(是的,那个是6个)秒。从用户体验的角度来看,他们在屏幕显示之前已经多次按了几次,因为它需要很长时间。
我从iOS 6开始使用相同的代码,但现在看起来特别糟糕。如果有人对如何加快速度有任何想法,那将非常感激。
基本上,我的头文件中有以下内容:
interface MyViewController : UICollectionViewController <UIDocumentInteractionControllerDelegate>
{
UIDocumentInteractionController *docController;
}
@end
在实施过程中,我只是做了以下事情:
在viewDidLoad中(最近移到这里以查看它是否有所改进):
docController = [[UIDocumentInteractionController alloc] init];
docController.delegate = self;
然后在collectionView:didSelectItemAtIndexPath中:我这样做:
NSURL *fileURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:document.Link ofType:@"" ]];
[docController setURL:fileURL];
PresentationViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"DocumentCell" forIndexPath:indexPath];
CGRect rect1 = cell.frame;
bool didShow = [docController presentOptionsMenuFromRect:rect1 inView:collectionView animated:YES];
其中document只是一个带有URL字符串的类。
如果您需要更多详细信息,请与我们联系。
提前感谢任何人提供的任何帮助。
- 更新: 在一些NSLog之后,我注意到它的下一行肯定是慢的:
bool didShow = [docController presentOptionsMenuFromRect:rect1 inView:collectionView animated:YES];
答案 0 :(得分:2)
<强> TL; DR:强>
您使用的方法是一个同步请求,它使用您的文档数据查找哪些应用能够读取您的文件。您需要将限制枚举的异步版本交换为只能解析您的文件类型的应用程序。
删除此方法:
- (BOOL)presentOptionsMenuFromRect:(CGRect)rect
inView:(UIView *)view
animated:(BOOL)animated
并替换为此方法:
- (BOOL)presentOpenInMenuFromRect:(CGRect)rect
inView:(UIView *)view
animated:(BOOL)animated
摘自Apple Docs:
此方法类似于presentOptionsMenuFromRect:inView:animated:方法,但提供的菜单仅限于能够打开当前文档的应用列表。此确定基于文档类型(由UTI属性指示)和已安装应用程序支持的文档类型。要支持一种或多种文档类型,应用程序必须使用CFBundleDocumentTypes键在Info.plist文件中注册这些类型。
如果没有支持打开文档的注册应用程序,则文档交互控制器不会显示菜单。
此方法异步显示选项菜单。当用户选择适当的选项时,文档交互控制器自动解除菜单。您也可以使用dismissMenuAnimated:方法以编程方式解除它。
答案 1 :(得分:1)
我遇到了类似的问题:
UIDocumentInteractionController.presentPreviewAnimated
完成需要很长时间。我发现在保存要预览的文件和呈现预览之间添加一个短暂的延迟修复了问题:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(100 * NSEC_PER_MSEC)), dispatch_get_main_queue(), {
self.controller.presentPreviewAnimated(true)
})