2015-02-03 5 views
4

Мое приложение имеет несколько кнопок, каждый из которых вызывает другой UIPopoverController. У нас есть «passthroughViews», поэтому кнопки все еще включены, пока popovers вверх. Нажатие одной из кнопок во время отображения popover отклоняет текущий popover и вызывает новый. Проблема в том, что на iOS8 это кажется очень медленным. Поппоры приходят и уходят сами по себе - это просто, когда мы переходим от одного к другому, что есть пауза между тем, когда первый закрывается, а следующий начинает показывать. Я называю эти функции увольнениемПодвоенный и presentPopoverFromRect: обращается к спине, так что между ними ничего не происходит. Я попытался установить «анимированный» на NO для обоих из них, но пауза все еще остается. Любая помощь приветствуется.Переход от одного UIPopoverController к другому медленный на iOS8

+0

вы можете разместить соответствующий код? –

ответ

0

Вместо того, чтобы закрывать popover, повторно назначьте тот же самый popover, когда нажата вторая кнопка. Переместите местоположение всплывающего окна на экране и загрузите в него новый контент. Похоже, это было бы быстрее и избежать любых проблем, связанных с конфликтом или латентностью, с которыми вы переходите от одного модального вида к другому (я подозреваю, что это проблема). Вы потеряете анимацию исчезновения/повторного появления, но она должна быть почти мгновенной и обеспечить хороший пользовательский интерфейс, потому что пользователям не нужно (в конечном счете) ждать анимации, чтобы увидеть их содержимое, когда они нажимают новую кнопку так или иначе.

0

Что находится внутри этих popovers? Если они привязаны к чему-то, работающему по основному потоку, то вы, вероятно, видите это как ваш элемент задержки. Возможно, вы захотите склонить свои методы viewDidLoad и viewWillAppear. Попробуйте запустить довольно крупные процессы в фоновом потоке и обновить его после появления.

Если вы используете хранилище основных данных, вы, вероятно, используете основной контекст, который всегда работает в основном потоке. Попробуйте кэшировать эти вызовы заблаговременно или запустите ваши выборки на дочернем потоке и верните их в основной поток после загрузки popover.

+1

У нас есть много popovers, которые все показывают эту медлительность. И поскольку проблемы с производительностью не существует на iOS 7, я должен заключить, что это не связано с кодом моего приложения. – imLanky

+0

Кажется, в iOS 8 Apple добавила UIPopoverPresentationController в микс. Это может иметь проблемы с производительностью с несколькими popovers. Я бы подумал о том, чтобы перепроектировать приложение, чтобы удалить дополнительные popovers. Это не совсем правильный дизайн пользовательского интерфейса. – Derek

0

Попробуйте этот код,

[UIView transitionWithView:pop1.contentViewController.view duration:0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ 

    [pop1 dismissPopoverAnimated:NO]; 

} completion:^(BOOL finished) { 

    [pop2 presentPopoverFromRect:btn.bounds inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:NO]; 

}]; 

надеюсь, что это помогает.

0

У меня была аналогичная проблема, из-за которой голова ударила по этой проблеме почти целый день: UIPopoverController был очень медленным, чтобы появляться иногда (иногда это было вяло, другое время почти прекрасное, другое - как 4 " появляются ...), и это произошло только на iOs8 (iOs7 всегда мигает-быстро), что приводит меня к мысли, что мое решение может помочь вам.

После долгих отладки я пришел к выводу, что проблема для меня была связана с тем, что я показал popover в пределах

- (NSIndexPath *) tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath; 

(но я бы не исключал, что существуют другие подобные случаи).

Мое решение работает метод presentPopoverFromRect: (мои журналы показали, что это был медленный метод) только после того, как метод willSelectRowAtIndexPath: закончился (как по сути дела, я переполнена весь поповер «Initialize и шоу» в функции для задержки а также, чтобы быть в безопасности, и потому, что мой код уже был таким).

Это сводится к управлению инициализации UIPopoverController и код отображения в блоке, как это:

dispatch_async(dispatch_get_main_queue(), ^() { 
    // Do the popover stuff here 
}); 

Даже если вы не используете таблицы, другие подобные проблемы могут существовать в iOs8 (потому что это является ошибка Apple!), так что я предполагаю, что это может стоит попробовать ...

Надеется, что это помогает, Приветствия

Смежные вопросы