On iOS 13.0 (Xcode 11.0GM2), rotating the device back-and-forth will lead to a completely unresponsive app. This does not reproduce on an iOS 12.4 simulator (with Xcode 10.3).
Notably, I don’t see this behavior in Studio Preview, which also uses a split view controller, but with a collection view as the primary menu.
Reproduction
Load any example.
Rotate the device, then rotate it again to the original orientation.
Observe deadlock and incompletely-redrawn views:
Instruments time profile of the main thread
Click to expand thread trace...
```
33.20 s 99.9% 0 s Main Thread 0x47b0d9
33.20 s 99.9% 0 s start
33.20 s 99.9% 0 s main
33.20 s 99.9% 0 s UIApplicationMain
33.20 s 99.9% 0 s GSEventRunModal
33.20 s 99.9% 0 s CFRunLoopRunSpecific
33.20 s 99.9% 0 s __CFRunLoopRun
33.20 s 99.9% 0 s __CFRunLoopDoSources0
33.20 s 99.9% 0 s __CFRunLoopDoSource0
33.20 s 99.9% 0 s __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
33.20 s 99.9% 0 s -[FBSSerialQueue _performNextFromRunLoopSource]
33.20 s 99.9% 0 s -[FBSSerialQueue _queue_performNextIfPossible]
33.20 s 99.9% 0 s __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__
33.20 s 99.9% 0 s _dispatch_block_invoke_direct
33.20 s 99.9% 0 s _dispatch_client_callout
33.20 s 99.9% 0 s __88-[FBSWorkspaceScenesClient sceneID:updateWithSettingsDiff:transitionContext:completion:]_block_invoke
33.20 s 99.9% 0 s -[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:]
33.20 s 99.9% 0 s __88-[FBSWorkspaceScenesClient sceneID:updateWithSettingsDiff:transitionContext:completion:]_block_invoke_2
33.20 s 99.9% 0 s -[FBSSceneImpl updater:didUpdateSettings:withDiff:transitionContext:completion:]
33.20 s 99.9% 0 s -[UIApplicationSceneClientAgent scene:handleEvent:withCompletion:]
33.20 s 99.9% 0 s -[UIScene scene:didUpdateWithDiff:transitionContext:completion:]
33.20 s 99.9% 0 s -[UIScene _emitSceneSettingsUpdateResponseForCompletion:afterSceneUpdateWork:]
33.20 s 99.9% 0 s __64-[UIScene scene:didUpdateWithDiff:transitionContext:completion:]_block_invoke
33.20 s 99.9% 0 s -[_UIWindowSceneDeviceOrientationSettingsDiffAction _performActionsForUIScene:withUpdatedFBSScene:settingsDiff:fromSettings:transitionContext:lifecycleActionType:]
33.20 s 99.9% 0 s _UISceneSettingsDiffActionPerformActionsWithDelayForTransitionContext
33.20 s 99.9% 0 s __163-[_UIWindowSceneDeviceOrientationSettingsDiffAction _performActionsForUIScene:withUpdatedFBSScene:settingsDiff:fromSettings:transitionContext:lifecycleActionType:]_block_invoke
33.20 s 99.9% 0 s -[_UIWindowSceneDeviceOrientationSettingsDiffAction _updateDeviceOrientationWithSettingObserverContext:windowScene:transitionContext:]
33.20 s 99.9% 0 s _UISceneSettingsDiffActionPerformChangesWithTransitionContext
33.20 s 99.9% 0 s +[BSAnimationSettings(UIKit) tryAnimatingWithSettings:actions:completion:]
33.20 s 99.9% 0 s __134-[_UIWindowSceneDeviceOrientationSettingsDiffAction _updateDeviceOrientationWithSettingObserverContext:windowScene:transitionContext:]_block_invoke
33.20 s 99.9% 0 s -[UIDevice setOrientation:animated:]
33.20 s 99.9% 0 s -[NSNotificationCenter postNotificationName:object:userInfo:]
33.20 s 99.9% 0 s _CFXNotificationPost
33.20 s 99.9% 0 s -[_CFXNotificationRegistrar find:object:observer:enumerator:]
33.20 s 99.9% 0 s ___CFXNotificationPost_block_invoke
33.20 s 99.9% 0 s _CFXRegistrationPost1
33.20 s 99.9% 0 s __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__
33.20 s 99.9% 0 s -[UIWindow _updateToInterfaceOrientation:duration:force:]
33.20 s 99.9% 0 s __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke
33.20 s 99.9% 0 s -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:]
33.20 s 99.9% 0 s -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:]
33.20 s 99.9% 0 s -[UIWindow _rotateWindowToOrientation:updateStatusBar:duration:skipCallbacks:]
33.20 s 99.9% 0 s -[UIWindow _rotateToBounds:withAnimator:transitionContext:]
33.20 s 99.9% 0 s -[_UIWindowRotationAnimationController animateTransition:]
33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:]
33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:]
33.20 s 99.9% 0 s __58-[_UIWindowRotationAnimationController animateTransition:]_block_invoke
33.20 s 99.9% 0 s +[UIView(Internal) _performBlockDelayingTriggeringResponderEvents:forScene:]
33.20 s 99.9% 0 s __58-[_UIWindowRotationAnimationController animateTransition:]_block_invoke_2
33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:]
33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:]
33.20 s 99.9% 0 s -[_UIViewControllerTransitionContext __runAlongsideAnimations]
33.20 s 99.9% 0 s -[_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:]
33.20 s 99.9% 0 s __95-[UIViewController(AdaptiveSizing) _window:viewWillTransitionToSize:withTransitionCoordinator:]_block_invoke.3449
33.20 s 99.9% 0 s -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:newSize:]
33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:]
33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:]
33.20 s 99.9% 0 s __86-[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:newSize:]_block_invoke
33.20 s 99.9% 0 s -[CALayer layoutIfNeeded]
33.20 s 99.9% 1.00 ms CA::Layer::layout_if_needed(CA::Transaction*)
33.15 s 99.8% 2.00 ms -[CALayer layoutSublayers]
31.84 s 95.8% 2.00 ms -[UINavigationBar layoutSublayersOfLayer:]
31.78 s 95.6% 9.00 ms -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
31.52 s 94.9% 4.00 ms -[UINavigationBar layoutSubviews]
31.33 s 94.3% 4.00 ms -[_UINavigationBarVisualProviderModernIOSAccessibility layoutSubviews]
22.63 s 68.1% 2.00 ms AXPerformBlockAsynchronouslyOnMainThread
22.54 s 67.8% 1.00 ms dispatch_async
22.53 s 67.8% 0 s _dispatch_introspection_queue_item_enqueue_hook
22.14 s 66.6% 2.74 s gcd_queue_item_enqueue_hook
19.30 s 58.1% 19.30 s __gcd_queue_item_enqueue_hook_block_invoke
```
On iOS 13.0 (Xcode 11.0GM2), rotating the device back-and-forth will lead to a completely unresponsive app. This does not reproduce on an iOS 12.4 simulator (with Xcode 10.3).
Notably, I don’t see this behavior in Studio Preview, which also uses a split view controller, but with a collection view as the primary menu.
Reproduction
Instruments time profile of the main thread
Click to expand thread trace...
``` 33.20 s 99.9% 0 s Main Thread 0x47b0d9 33.20 s 99.9% 0 s start 33.20 s 99.9% 0 s main 33.20 s 99.9% 0 s UIApplicationMain 33.20 s 99.9% 0 s GSEventRunModal 33.20 s 99.9% 0 s CFRunLoopRunSpecific 33.20 s 99.9% 0 s __CFRunLoopRun 33.20 s 99.9% 0 s __CFRunLoopDoSources0 33.20 s 99.9% 0 s __CFRunLoopDoSource0 33.20 s 99.9% 0 s __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 33.20 s 99.9% 0 s -[FBSSerialQueue _performNextFromRunLoopSource] 33.20 s 99.9% 0 s -[FBSSerialQueue _queue_performNextIfPossible] 33.20 s 99.9% 0 s __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ 33.20 s 99.9% 0 s _dispatch_block_invoke_direct 33.20 s 99.9% 0 s _dispatch_client_callout 33.20 s 99.9% 0 s __88-[FBSWorkspaceScenesClient sceneID:updateWithSettingsDiff:transitionContext:completion:]_block_invoke 33.20 s 99.9% 0 s -[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:] 33.20 s 99.9% 0 s __88-[FBSWorkspaceScenesClient sceneID:updateWithSettingsDiff:transitionContext:completion:]_block_invoke_2 33.20 s 99.9% 0 s -[FBSSceneImpl updater:didUpdateSettings:withDiff:transitionContext:completion:] 33.20 s 99.9% 0 s -[UIApplicationSceneClientAgent scene:handleEvent:withCompletion:] 33.20 s 99.9% 0 s -[UIScene scene:didUpdateWithDiff:transitionContext:completion:] 33.20 s 99.9% 0 s -[UIScene _emitSceneSettingsUpdateResponseForCompletion:afterSceneUpdateWork:] 33.20 s 99.9% 0 s __64-[UIScene scene:didUpdateWithDiff:transitionContext:completion:]_block_invoke 33.20 s 99.9% 0 s -[_UIWindowSceneDeviceOrientationSettingsDiffAction _performActionsForUIScene:withUpdatedFBSScene:settingsDiff:fromSettings:transitionContext:lifecycleActionType:] 33.20 s 99.9% 0 s _UISceneSettingsDiffActionPerformActionsWithDelayForTransitionContext 33.20 s 99.9% 0 s __163-[_UIWindowSceneDeviceOrientationSettingsDiffAction _performActionsForUIScene:withUpdatedFBSScene:settingsDiff:fromSettings:transitionContext:lifecycleActionType:]_block_invoke 33.20 s 99.9% 0 s -[_UIWindowSceneDeviceOrientationSettingsDiffAction _updateDeviceOrientationWithSettingObserverContext:windowScene:transitionContext:] 33.20 s 99.9% 0 s _UISceneSettingsDiffActionPerformChangesWithTransitionContext 33.20 s 99.9% 0 s +[BSAnimationSettings(UIKit) tryAnimatingWithSettings:actions:completion:] 33.20 s 99.9% 0 s __134-[_UIWindowSceneDeviceOrientationSettingsDiffAction _updateDeviceOrientationWithSettingObserverContext:windowScene:transitionContext:]_block_invoke 33.20 s 99.9% 0 s -[UIDevice setOrientation:animated:] 33.20 s 99.9% 0 s -[NSNotificationCenter postNotificationName:object:userInfo:] 33.20 s 99.9% 0 s _CFXNotificationPost 33.20 s 99.9% 0 s -[_CFXNotificationRegistrar find:object:observer:enumerator:] 33.20 s 99.9% 0 s ___CFXNotificationPost_block_invoke 33.20 s 99.9% 0 s _CFXRegistrationPost1 33.20 s 99.9% 0 s __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 33.20 s 99.9% 0 s -[UIWindow _updateToInterfaceOrientation:duration:force:] 33.20 s 99.9% 0 s __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke 33.20 s 99.9% 0 s -[UIWindow _setRotatableViewOrientation:updateStatusBar:duration:force:] 33.20 s 99.9% 0 s -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] 33.20 s 99.9% 0 s -[UIWindow _rotateWindowToOrientation:updateStatusBar:duration:skipCallbacks:] 33.20 s 99.9% 0 s -[UIWindow _rotateToBounds:withAnimator:transitionContext:] 33.20 s 99.9% 0 s -[_UIWindowRotationAnimationController animateTransition:] 33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:] 33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] 33.20 s 99.9% 0 s __58-[_UIWindowRotationAnimationController animateTransition:]_block_invoke 33.20 s 99.9% 0 s +[UIView(Internal) _performBlockDelayingTriggeringResponderEvents:forScene:] 33.20 s 99.9% 0 s __58-[_UIWindowRotationAnimationController animateTransition:]_block_invoke_2 33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:] 33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] 33.20 s 99.9% 0 s -[_UIViewControllerTransitionContext __runAlongsideAnimations] 33.20 s 99.9% 0 s -[_UIViewControllerTransitionCoordinator _applyBlocks:releaseBlocks:] 33.20 s 99.9% 0 s __95-[UIViewController(AdaptiveSizing) _window:viewWillTransitionToSize:withTransitionCoordinator:]_block_invoke.3449 33.20 s 99.9% 0 s -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:newSize:] 33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) animateWithDuration:delay:options:animations:completion:] 33.20 s 99.9% 0 s +[UIView(UIViewAnimationWithBlocks) _setupAnimationWithDuration:delay:view:options:factory:animations:start:animationStateGenerator:completion:] 33.20 s 99.9% 0 s __86-[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:newSize:]_block_invoke 33.20 s 99.9% 0 s -[CALayer layoutIfNeeded] 33.20 s 99.9% 1.00 ms CA::Layer::layout_if_needed(CA::Transaction*) 33.15 s 99.8% 2.00 ms -[CALayer layoutSublayers] 31.84 s 95.8% 2.00 ms -[UINavigationBar layoutSublayersOfLayer:] 31.78 s 95.6% 9.00 ms -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 31.52 s 94.9% 4.00 ms -[UINavigationBar layoutSubviews] 31.33 s 94.3% 4.00 ms -[_UINavigationBarVisualProviderModernIOSAccessibility layoutSubviews] 22.63 s 68.1% 2.00 ms AXPerformBlockAsynchronouslyOnMainThread 22.54 s 67.8% 1.00 ms dispatch_async 22.53 s 67.8% 0 s _dispatch_introspection_queue_item_enqueue_hook 22.14 s 66.6% 2.74 s gcd_queue_item_enqueue_hook 19.30 s 58.1% 19.30 s __gcd_queue_item_enqueue_hook_block_invoke ```/cc @captainbarbosa @julianrex