Quicklook/QLPreviewController, некоторые проблемы с iOS 8, но все работает с iOS 7.1

Я работаю с QuickLook для просмотра файлов PDF.

Он работает правильно в iOS 7.1, но с iOS 8 GM возникают некоторые проблемы.

Картинки лучше слов, я хочу показать вам проблемы:

iOS 7.1 Xcode 6 (работает нормально)

Переход с QuickLook (без сбоев)

Переход QuickLook iOS 7.1

Прокрутка страницы, панель навигации хорошо скрывается

Прокрутка страницы QuickLook iOS 7.1

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

А теперь iOS 8 GM с Xcode 6

Переход с QuickLook...

Переход QuickLook iOS 8 GM

Прокрутка страницы, панель навигации не скрывается, индикатор страницы скрывается за панелью навигации

Прокрутка страницы 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 !"];
    }
}

Спасибо за вашу помощь ;)


person Kevin Machado    schedule 15.09.2014    source источник
comment
Сообщите об ошибке на странице bugreport.apple.com. В областях, которые не были обозначены как измененные в примечаниях к выпуску iOS, подобные проблемы совместимости двоичных файлов являются ошибками...   -  person Thomas Deniau    schedule 16.09.2014
comment
Вы уже нашли какие-либо исправления для этих проблем?   -  person Jamal Zafar    schedule 29.09.2014
comment
Нет исправления, нет ответа от Apple.   -  person Kevin Machado    schedule 29.09.2014
comment
Привет! любое решение по этому поводу?? обходной путь? Благодарность   -  person Frade    schedule 28.10.2014
comment
Apple сообщила мне, что это ошибка 18074631.   -  person Randall Sutton    schedule 06.01.2015


Ответы (2)


У меня такая же проблема с переходом. Мое решение состояло в том, чтобы сохранить previewController в свойстве и инициализировать его один раз в viewDidLoad в моем представленном контроллере представления.

Мне также приходилось устанавливать currentPreviewItemIndex равным 0 каждый раз, когда я нажимаю контроллер предварительного просмотра, хотя я показываю только один файл за раз. Если я не устанавливаю значение, zip-файлы не открываются по умолчанию, а контроллер предварительного просмотра вместо этого показывает кнопку «Показать содержимое», которая открывает новый контроллер предварительного просмотра, страдающий той же проблемой перехода.

Я все еще пытаюсь исправить проблему с не скрывающейся панелью навигации. В примере проекта Apple все работает нормально. Кажется, что модальное представление навигационного контроллера вызывает проблему в моем проекте.

ИЗМЕНИТЬ:

Это определенно кажется мне ошибкой. Проблема с панелью навигации появляется только в том случае, если контроллер навигации представлен в модальном режиме. Мне кажется, что контроллер предварительного просмотра создает новый контроллер навигации, а также новую панель навигации. Этот скрыт под панелью навигации контроллера навигации хостинга. На этом снимке экрана хорошо видна проблема: введите здесь описание изображения

Полоса, выделенная синим цветом, — это 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];
    }    
}
person MBulli    schedule 08.12.2014

Недавно мне удалось исправить ошибку с фоном (анимация все еще прерывистая).

Чтобы исправить проблему с «черным фоном», я установил собственный цвет фона представления навигационного контроллера при нажатии. Возвращаясь обратно к моему контроллеру представления, я обязательно восстанавливаю исходный цвет фона до нуля.

- (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.

Это решение определенно является хаком в лучшем виде, но надеюсь, что оно поможет!

person Pavel Dusatko    schedule 17.10.2014