Устаревшие методы ротации iOS 8 - обратная совместимость

В iOS 8 методы поворота интерфейса устарели. Это включает:

  • willRotateToInterfaceOrientation:duration:
  • didRotateFromInterfaceOrientation:
  • willAnimateRotationToInterfaceOrientation:duration:

Методы замены включают в себя:

  • willTransitionToTraitCollection:withTransitionCoordinator:
  • viewWillTransitionToSize:withTransitionCoordinator:

Если новые методы ротации не реализованы, а проект компилируется с помощью iOS 8 SDK, контроллеры представления - не будут принимать вызовы - к устаревшим методам ротации.

Меня беспокоит следующее: что происходит с приложением, уже находящимся в AppStore, созданном с iOS 7 SDK? Будут ли устаревшие методы вращения по-прежнему вызываться на устройстве iOS 8 или нет?

РЕДАКТИРОВАТЬ:

Методы ротации все еще называются, но в iOS 8 есть некоторые изменения / проблемы / ошибки.

Также UIScreen теперь ориентирован на интерфейс

6 ответов

Решение

Методы ротации устарели в iOS 8 SDK. Это никак не повлияет на приложения, созданные с помощью iOS 7 SDK, даже на iOS 8 и, возможно, в нескольких будущих версиях iOS.

В качестве примера font собственностью UIButton устарела с iOS 3.0 и по-прежнему доступна в iOS 7.0.

У меня просто была эта проблема, и я хотел использовать те же методы, которые я использовал раньше (по крайней мере, сейчас), так что это то, что я сделал.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    //The device has already rotated, that's why this method is being called.
    UIInterfaceOrientation toOrientation   = [[UIDevice currentDevice] orientation];
    //fixes orientation mismatch (between UIDeviceOrientation and UIInterfaceOrientation)
    if (toOrientation == UIInterfaceOrientationLandscapeRight) toOrientation = UIInterfaceOrientationLandscapeLeft;
    else if (toOrientation == UIInterfaceOrientationLandscapeLeft) toOrientation = UIInterfaceOrientationLandscapeRight;

    UIInterfaceOrientation fromOrientation = [[UIApplication sharedApplication] statusBarOrientation];

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [self willAnimateRotationToInterfaceOrientation:toOrientation duration:[context transitionDuration]];
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) {
        [self didRotateFromInterfaceOrientation:fromOrientation];
    }];

}

Я все еще не уверен, должен ли я использовать это за пределами блока анимации, так как у меня нет продолжительности.

    [self willRotateToInterfaceOrientation:toOrientation duration:0.0];

Устаревшие методы ротации, которые вы перечислили, по-прежнему вызываются при запуске приложения на устройствах iOS 8+. Если вы поддерживаете iOS 7, вы можете продолжать использовать их без проблем. Если вы поддерживаете только iOS 8+, было бы разумно использовать не устаревшие методы.

Однако обратите внимание, что если вы реализуете новые методы ротации и устаревшие методы в одном контроллере представления, при запуске на iOS 7 будут вызываться устаревшие методы, а на iOS 8+ будут вызываться только новые методы, которые заменили эти методы. которые устарели.

Например, если вы только реализуете willRotateToInterfaceOrientationэтот метод будет вызываться при запуске на iOS 7 и 8. Если вы добавите viewWillTransitionToSize, iOS 7 все равно будет звонить willRotateToInterfaceOrientation но iOS 8 не будет, вместо этого он будет только звонить viewWillTransitionToSize,

Я бы проверил этот конкретный случай на 100% уверенность, но я не ожидаю никаких проблем. Я бы также рекомендовал вам посмотреть сеанс 216 Building Adaptive Apps with UIKit с WWDC 2014, чтобы получить больше информации. Похоже, что устаревшие методы не вызываются, поэтому приложение должно быть обновлено для правильной работы с устройствами под управлением iOS 8.

Методы ротации все еще работают, НО существуют другие проблемы:

Для меня, здесь мы вращаем "вещи вручную" с некоторыми вычислениями и файлом plist, который отслеживает размер заголовков и тому подобное (поэтому, если мы хотим что-то изменить кнопки и т. Д., Мы изменим только этот plist, а не все отдельные xibs), И весь наш код вращения находится внутри willLayoutSubviews так что все правильно даже на новой iOS8... кроме меня также я видел, что для новой ios8 [[UIScreen mainScreen] bounds].size.width Теперь верните ширину в соответствии с ориентацией устройства, а не в реальном размере устройства.

Я опубликую это в другой теме:

- (BOOL) isIOS8OrAbove{
    float version802 = 1140.109985;
    float version8= 1139.100000; // there is no def like NSFoundationVersionNumber_iOS_7_1 for ios 8 yet?
    NSLog(@"la version actual es [%f]", NSFoundationVersionNumber);
    if (NSFoundationVersionNumber >= version8){
        return true;
    }
    return false;
}
Другие вопросы по тегам