Подтвердить что ты не робот

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

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

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

Способы замены включают:

  • willTransitionToTraitCollection:withTransitionCoordinator:
  • viewWillTransitionToSize:withTransitionCoordinator:

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

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

EDIT:

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

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

4b9b3361

Ответ 1

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

В качестве примера свойство font UIButton устарело с iOS 3.0 и все еще доступно в iOS 7.0.

Ответ 2

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

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

    //The device has already rotated, that 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];

Ответ 3

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

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

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

Ответ 4

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

Ответ 6

Для меня здесь мы вращаем "вещи вручную" с некоторыми вычислениями и файл 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;
}