IOS: как запустить функцию после поворота устройства (Swift)

У меня есть один UIView, который не использует Auto-Layout, а некоторые компоненты отображаются на основе их процентов координат X и Y из основного вида.

Раньше я бы запускал функцию для обновления своих позиций в didRotateFromInterfaceOrientation, но я вижу, что это теперь не рекомендуется в iOS8.

Я просмотрел viewWillTransitionToSize, но он дает странные результаты, и, похоже, не существует функция viewDidtransitionToSize.

Есть ли простой способ (в Swift) запускать функцию после вращения устройства?

Ответ 1

Метод делегата viewWillTransitionToSize вызывается с UIViewControllerTransitionCoordinator соответствующим объектом. Метод, объявляемый протоколом, animateAlongsideTransition(_:animation, completion:). Вы можете использовать это, чтобы выполнить код после завершения перехода.

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    coordinator.animateAlongsideTransition(nil, completion: {
        _ in

        // Your code here
    })
}

Ответ 2

Выше ответ fooobar.com/questions/91418/... абсолютно прав, благодаря Acey и Moonwalkr. Но для swift 3.0 он будет выглядеть следующим образом:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: nil) { _ in
        // Your code here
    }
}

Ответ 3

Хотя здесь не запрашивается версия Objective C:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {

    // change any properties on your views

} completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    if( UIDeviceOrientationIsPortrait(orientation) ) {
        NSLog(@"portrait");
    } else {
        NSLog(@"landscape");
    }  
}];
}