Quicklook / QLPreviewController,iOS 8的一些问题,但一切都适用于iOS 7.1

时间:2014-09-15 09:45:42

标签: ios objective-c quicklook

我正在使用QuickLook查看PDF文件。

它在iOS 7.1中正常运行,但iOS 8 GM会出现一些问题。

图片比文字好,我想告诉你问题:

iOS 7.1 Xcode 6(正常工作)

使用QuickLook进行转换(无失败)

Transition QuickLook iOS 7.1

页面滚动,navigationBar隐藏得很好

Page scroll QuickLook iOS 7.1

-------------------------------------------- ------------------------------

现在,iOS 8 GM与Xcode 6

使用QuickLook转换...

Transition QuickLook iOS 8 GM

页面滚动,导航栏不隐藏,页面指示器隐藏在NavigationBar后面

Page scroll QuickLook iOS 8 GM

与iPhone模拟器,iPad模拟器,iPhone设备和iPad设备相同。

你可以在这里看到我的源代码:

- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)previewController
{
    NSInteger numToPreview = 0;
    if (currentSection == CVSectionConvocations)
        numToPreview = self.convocation.convocations.count;
    else if (currentSection == CVSectionAttachments)
        numToPreview = self.convocation.attachements.count;
    return numToPreview;
}

- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx
{
    PDF *pdf;
    if (currentSection == CVSectionConvocations)
        pdf = self.convocation.convocations[idx];
    else if (currentSection == CVSectionAttachments)
        pdf = self.convocation.attachements[idx];
    return [pdf path];
}



- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    // determine section
    currentSection = (indexPath.section == 0 ? CVSectionConvocations : CVSectionAttachments);

    PDF *pdf;
    if (currentSection == CVSectionConvocations)
        pdf = self.convocation.convocations[indexPath.row];
    else if (currentSection == CVSectionAttachments)
        pdf = self.convocation.attachements[indexPath.row];

    if ([pdf isStored]) {
        QLPreviewController *previewController = [[QLPreviewController alloc] init];
        previewController.dataSource = self;
        previewController.delegate = self;

        previewController.currentPreviewItemIndex = indexPath.row;
        [[self navigationController] pushViewController:previewController animated:YES];
    } else {
        [self displayMessage:@"Document not found" title:@"Oups !"];
    }
}

感谢您的帮助;)

2 个答案:

答案 0 :(得分:2)

我在过渡时遇到了同样的问题。我的解决方案是将previewController存储在一个属性中,并在我的呈现视图控制器中的viewDidLoad中初始化一次。

每次推动预览控制器时,我还必须将currentPreviewItemIndex设置为等于0,尽管我此时只显示一个文件。如果我没有设置值,默认情况下不打开zip文件,并且预览控制器会显示“显示内容”。相反,它将打开一个遇到相同转换问题的新预览控制器。

我还在尝试修复不隐藏的导航栏问题。在apple sample project中一切正常。似乎模态显示导航控制器会导致我的项目出现问题。

编辑:

这对我来说肯定是一个错误。仅当导航控制器呈现为模态时,才会显示导航栏的问题。在我看来,预览控制器创建了一个新的导航控制器和一个新的导航栏。这个隐藏在主机导航控制器的导航栏下。此屏幕截图显示了问题: enter image description here

蓝色突出显示的栏是self.navigationBar,蓝色框架栏属于预览控制器。只有当导航控制器呈现为模态时,才会发生这种情况。

我的解决方法是将我的视图控制器设置为导航控制器委托,并在推送预览控制器后立即隐藏导航栏。我只在iOS 8.0和8.1上测试了我的代码。

- (void)viewDidLoad {
    [super viewDidLoad];

    self.previewController = [[QLPreviewController alloc] init];
    self.previewController.delegate = self;
    self.previewController.dataSource = self;

    self.navigationController.delegate = self;
}

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    // Workaround:
    // If the previewController is pushed to a navigation controller which is presented modal, it appears that the preview controller adds a second navigation bar (and navigation controller).
    // This results in a UI glitch that one nav bar is always visible. To prevent this we hide our navigation bar so that only the one owned by the preview controller is visible.
    // Note that this only happends if the navigation controller is presented modal, thus it seems to be an iOS bug.
    if (viewController == self.previewController) {
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    }    
}

答案 1 :(得分:1)

我最近能够解决背景问题错误(动画仍然不稳定)。

修复黑色背景'问题我在推送时设置导航控制器的自定义背景颜色。当返回我的视图控制器时,我确保将原始背景颜色恢复为nil。

- (void)viewWillApear:(BOOL)animated {
   [super viewWillApear:animated];
   self.navigationController.view.backgroundColor = nil;

   // Optional - In order to ease the animation bug
   self.view.alpha = 1.0;
}


- (void)viewWillDissapear:(BOOL)animated {
   [super viewWillDissapear:animated];
   self.navigationController.view.backgroundColor = [UIColor whiteColor];

   // Optional - In order to ease the animation bug
   [UIView animateWithDuration:0.35 animations:^{
      self.view.alpha = 0.0;
   }];
}

此代码应转到您正在推送QLPreviewController的视图控制器。

这个解决方案肯定是最好的解决方案,但希望它有所帮助!