Методы ротации устарели, эквивалент «didRotateFromInterfaceOrientation»?


137

Я пытаюсь реализовать новый viewWillTransitionToSizeметод, который был представлен в iOS 8 (все другие методы ротации устарели). Я хотел бы знать, что является эквивалентом didRotateFromInterfaceOrientationсейчас, так как есть ряд задач по очистке, которые нам нужно выполнить, и я не вижу блок, который мы можем назначить для UIViewControllerTransitionCoordinatorвызова при переходе к новому Размер заканчивается. Спасибо.

Ответы:


255

Ладно нашел его, просто надо использовать animateAlongsideTransition:completion:метод на пройденном UIViewControllerTransitionCoordinator.

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{   
    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context)
    {
        UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        // do whatever
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context)
    { 

    }];

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}

Будет ли этот метод вызываться каждый раз, когда мы вращаемся, как didRotateFromInterfaceOrientation? Не могли бы вы поделиться со мной методом, который вы использовали. Спасибо
ask123

2
Да, это будет. Это то, что я делаю: - (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; // do whatever } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { }]; [super viewWillTransitionToSize: size withTransitionCoordinator: coordinator]; }
странно

1
Спасибо - я добавлю быструю версию в качестве ответа, чтобы сэкономить время
DogCoffee

3
statusbarorientation устарела в iOS 9. Какой еще вариант?
Дипак Шарма

1
@DeepakSharma Я немного опоздал на вечеринку, но вы можете использовать [UIDevice currentDevice].orientation. Вы также можете передать это в UIDeviceOrientationIsPortrait([UIDevice currentDevice].orientation)или UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation). Надеюсь это поможет!
Джефф

70

Свифт Версия ответа странным

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    coordinator.animateAlongsideTransition({ (UIViewControllerTransitionCoordinatorContext) -> Void in

        let orient = UIApplication.sharedApplication().statusBarOrientation

        switch orient {
        case .Portrait:
            println("Portrait")
            // Do something
        default:
            println("Anything But Portrait")
            // Do something else
        }

        }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
            println("rotation completed")
    })

    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
}

Это странно, потому что я поместил это в свой ViewController, и он ничего не сделал printдля моего журнала. Я думаю, потому что этот метод не вызывается. Можете ли вы придумать что-нибудь еще, что нужно было бы подключить, чтобы это работало?
Поездка

Я просто добавил его в пустой проект (универсальное приложение), и он отлично работает без необходимости что-либо добавлять. Возможно, поместите инструкцию log в самом начале метода и посмотрите, вызывается ли он. Я не могу думать ни о чем, что вам нужно было бы добавить. На какой iOS вы работаете?
DogCoffee

@ DogCoffee .. ей не звонят. Это как-то связано с симулятором?
Сати

@Saty работает и в симуляторе - просто проверил еще раз. Работает как положено.
DogCoffee

1
statusbarorientation устарела в iOS 9. Какой еще вариант?
Дипак Шарма

10

iOS 10.3 и Swift 3

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {

        coordinator.animate(alongsideTransition: { (_) in
            let orient = newCollection.verticalSizeClass

            switch orient {
            case .compact:
                print("Lanscape")///Excluding iPads!!!

            default:
                print("Portrait")
            }
        }, completion: { _ in
            print("rotation completed")
        })

        super.willTransition(to: newCollection, with: coordinator)
    }

Зачем вам нужна анимация? Разве вы не можете проверить «newCollection» сразу?
цианид

@ Cyanide синхронизировать анимацию с моим
Майк Глухов

7

Принятый ответ в Swift 3 :

override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {
    coordinator.animate(alongsideTransition: { (_) in
        let orient = UIApplication.shared.statusBarOrientation

        switch orient {
        case .portrait:
            print("Portrait")
        // Do something
        default:
            print("Anything But Portrait")
            // Do something else
        }
    }, completion: { (UIViewControllerTransitionCoordinatorContext) -> Void in
      print("rotation completed")
    })

    super.willTransition(to: newCollection, with: coordinator)
}

У меня работает нормально 👍


У меня не работает на iOS 10 - он печатает старую ориентацию, а не новую.
Ваддади Картик

1
@VaddadiKartick, потому что вы должны использоватьlet orient = newCollection.verticalSizeClass switch orient { case .compact: print("Lanscape") // Do something default: print("Portrait") // Do something else }
Майк Глухов

5

Так как вопрос был: что было эквивалентно didRotateFromInterfaceOrientation

Я думал, что добавлю код ниже:

@implementation ViewController
- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
    [super traitCollectionDidChange:previousTraitCollection];
    if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassRegular) {
        NSLog(@"User has rotated to landscape");
    } else if (previousTraitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
        NSLog(@"User has rotated to portrait");
    }
}
@end

Я тестировал на iPhone в симуляторе, но мои операторы печати не запустятся, если я протестирую с помощью iPad, так как traitsCollection не изменится.

Это странно, потому что Apple рекомендует именно это :

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
    [super traitCollectionDidChange: previousTraitCollection];
    if ((self.traitCollection.verticalSizeClass != previousTraitCollection.verticalSizeClass)
        || self.traitCollection.horizontalSizeClass != previousTraitCollection.horizontalSizeClass)) {
        // your custom implementation here
    }
}

Во втором фрагменте кода отсутствует скобка
Антон Дузенко

Работает ли это на iPad, где вертикальные и горизонтальные классы являются обычными на полном экране?
Дипак Шарма

Ваш код не совпадает с кодом Apple, вы тестируете только класс вертикального размера.
ADG

Прошло много времени, похоже, содержание ссылки изменилось.
Технический инженер Нью-Йорка

3

[[UIApplication sharedApplication] statusBarOrientation]устарела в iOS9, вы должны проверить UITraitCollection для различных устройств.

  override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {

    if newCollection.containsTraitsInCollection(UITraitCollection(verticalSizeClass: .Regular)) {
      ...
    }
  }

6
Только сеттер устарел. Сотрудник Apple написал: «Чтение ориентации строки состояния не считается устаревшим, только запись в него. Это может быть ошибкой в ​​том, как мы создали заголовок, если вы видите это на получателе». ( forums.developer.apple.com/thread/12937 )
Грэм Перкс

Разве не получатель также не рекомендуется. Согласно документации это так.
Groot

0

На Ipad нет изменений в наборе признаков, поэтому вот как вы определяете вращение от начала и до конца. Вот синтаксис Swift 5:

override func viewWillTransition(to size: CGSize, with coordinator: 
UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    coordinator.animate(alongsideTransition: { [unowned self] _ in

        self.view.backgroundColor = UIColor.blue
        print("rotation in progress")

    }) { [unowned self] _ in
        self.view.backgroundColor = UIColor.green
        print("rotation complete")


    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.