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");
}
}];
}