Я получаю следующее в моем выводе Xcode во время простого перехода к просмотру в одном из моих UIViewController:
2020-07-12 11:18:53.483381-0700 ClubHub[9505:2551251] Metal GPU Frame Capture Enabled
2020-07-12 11:18:53.486918-0700 ClubHub[9505:2551251] Metal API Validation Enabled
2020-07-12 11:19:05.562915-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)
2020-07-12 11:19:05.563242-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Discarded (victim of GPU error/recovery) (IOAF code 5)
2020-07-12 11:19:05.563644-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Caused GPU Timeout Error (IOAF code 2)
2020-07-12 11:19:05.563824-0700 ClubHub[9505:2551365] Execution of the command buffer was aborted due to an error during execution. Caused GPU Timeout Error (IOAF code 2)
Кажется, это ново с iOS 12. Я видел, что это происходило на iPhone 7, а также iPhone X с iOS 12 и iOS 13, хотя я не думаю, что проблема связана с аппаратным обеспечением телефона c. Моя установка такова, что у меня есть общий c UIViewController, в который я помещаю два UIView, а затем переключаюсь между ними с помощью правой кнопки панели навигации. Как только ошибка возникает, кажется, что она больше не возникает, пока я не выйду из UIController, а затем вернусь к нему.
Переход выглядит следующим образом:
__weak __typeof(self) weakSelf = self;
// Animate the flip between the map and list views
[UIView transitionFromView: (self.showingMapView) ? self.mapView : self.listView toView: (self.showingMapView) ? self.listView : self.mapView
duration: 0.75
options:(self.showingMapView) ? UIViewAnimationOptionTransitionFlipFromLeft | UIViewAnimationOptionShowHideTransitionViews : UIViewAnimationOptionTransitionFlipFromRight | UIViewAnimationOptionShowHideTransitionViews
completion: ^(BOOL finished)
{
__strong __typeof(weakSelf)strongSelf = weakSelf;
strongSelf.showingMapView = !strongSelf.showingMapView;
[strongSelf.switchViews setTitle:(strongSelf.showingMapView) ? [StringResources getString: @"kList"] : [StringResources getString: @"kMap"] forState:UIControlStateNormal];
}];
Единственное, что я могу Думаю, проблема может в том, что один из дочерних UIViews содержит MKMapView, но раньше это никогда не вызывало проблем. Я не использую Metal напрямую в своем приложении.
Приветствуются любые мысли или варианты.
ОБНОВЛЕНИЕ
Я заменил каждый моих представлений с помощью простого UIView, одного красного цвета, а другого синего. Переход происходит без проблем. Затем я заменил красное представление представлением списка и по-прежнему не имел проблем с переключением между списком и синими представлениями. Наконец, я заменил красное представление на MapView, и проблема проявляется.
При дальнейшем исследовании выяснилось, что обновление карты (которое MKMapView выполняет асинхронно, когда оно не скрыто - обновление аннотаций и наложенных представлений) кажется, мешает переходу. Я проверил это, удалив флаг UIViewAnimationOptionShowHideTransitionViews
, который удаляет и добавляет представление к родительскому элементу. Это устраняет проблему. Однако макет карты неверен, пока я не смогу наложить ограничения на представление в обработчике завершения перехода. Кто-нибудь каждый испытал это или знает, как решить?