Это может произойти, если контроллер представления представляется после того, как iOS поставит в очередь событие rotate, но до обработки события rotate.Исходя из наблюдений, я думаю, что события поворота специфичны для представляемых в настоящее время контроллеров представления.
Это полезный способ думать об этом:
- Событие поворота ставится в очередь iOSдля контроллера вида сверху: A.
- Ваш код представляет контроллер вида, B.
- Событие вращения отменено, но оно касается только контроллера вида A.
К счастью, это действительно легко исправить.Просто предположите, что в очереди событий есть событие поворота, и убедитесь, что ваше представление действительно представлено после его.Вы делаете это, ставя в очередь представление своего нового контроллера представления, а не представляя это непосредственно.Блоки, поставленные в очередь в главной очереди, будут выполняться после любых событий, уже поставленных в очередь (например, события поворота), но за до пользователь получает возможность взаимодействовать с вашим пользовательским интерфейсом.
Изменение:
[self performSegueWithIdentifier: @"firstRun" sender: self];
Кому:
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier: @"firstRun" sender: self];
});
После этого вы получите следующее поведение:
- Событие поворота помещается в очередь iOS дляконтроллер вида сверху, A.
- Ваш код планирует блок, который будет представлять новый контроллер вида.
- Событие rotate исключено, но оно касается только контроллера вида A.
- Новый контроллер вида B представлен вашим блоком.Он получает новую ориентацию.