iOS 5: willRotateToInterfaceOrientation: продолжительность не вызывается при первой загрузке контроллера - PullRequest
8 голосов
/ 05 ноября 2011

Я реализовал этот метод в своем коде, чтобы знать, когда произойдет изменение ориентации интерфейса:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

Я полагаюсь на это, чтобы вызвать мои настройки.В iOS 4 или 5 он вызывается правильно при изменении ориентации .

В iOS 4 он также вызывается при первой загрузке контроллера (независимо от того, изменяется ориентация или нет,вызывается один раз в начале с правильной ориентацией).

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

Есть идеи, почему это поведение изменилось?Какой лучший способ справиться с этим?Должен ли я проверить, какая ориентация есть в viewDidLoad, если на iOS 5, а затем вручную вызвать методы willRotate и didRotate?Это похоже на взлом.

Спасибо за любой вклад, который вы можете предоставить.

Ответы [ 4 ]

15 голосов
/ 08 ноября 2011

Поскольку мне не хватает времени, мне пришлось обойти это странное поведение и вручную вызвать методы ориентации в viewDidLoad. Это что-то вроде хака, но пока работает нормально.

В viewDidLoad Я добавил это:

if ( SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0") ) {
    UIInterfaceOrientation interfaceOrientation = [[UIApplication sharedApplication] statusBarOrientation];
    [self willRotateToInterfaceOrientation:interfaceOrientation duration:0.2f];
}

Затем я добавил это в общий заголовочный файл:

// iOS Version Checking
#define SYSTEM_VERSION_EQUAL_TO(v)                  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedSame)
#define SYSTEM_VERSION_GREATER_THAN(v)              ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedDescending)
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN(v)                 ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)
#define SYSTEM_VERSION_LESS_THAN_OR_EQUAL_TO(v)     ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedDescending)

Я получил проверку версии iOS из ответа на этот вопрос на SO .

1 голос
/ 26 января 2013

Начиная с iOS 5 и выше, вы должны строить иерархию контроллеров представления (используя -addChildViewController: ). Затем контроллеры дочерних представлений снова начинают вызывать -willRotateToInterfaceOrientation: interfaceOrientation: и другие методы, связанные с интерфейсом (поскольку родительский контроллер будет уведомлять их об изменениях ориентации пользовательского интерфейса).

Пожалуйста, не используйте грязные методы.

Полезная документация: Документы Apple о 'addChildViewController:'

1 голос
/ 02 марта 2012

Я столкнулся с той же самой проблемой и вырывал свои волосы. Я наконец-то нашел решение, но, к сожалению, это будет только iOS 5.0 +:

Поместите следующий код в свой метод viewDidLoad в свой пользовательский UIViewController:

double delayInSeconds = 0.1f;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [UIViewController attemptRotationToDeviceOrientation];
});

Это подтолкнет обновление вращения к следующему циклу выполнения. attemptRotationToDeviceOrientation - это вызов iOS 5.0+.

1 голос
/ 08 ноября 2011

Даже я столкнулся с подобной проблемой и должен был переопределить ее в производном классе tabbarcontroller, чтобы заставить это работать:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [_tabBarConroller willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
}

Надеюсь, это поможет !!

...