Я работаю над принятием многозадачности для поддержки разделенного вида для приложения. Но я считаю, что traitCollectionDidChange не вызывается, когда приложение находится справа. Кто-нибудь имеет представление об этом?traitCollectionDidChange не вызывается при многозадачности
ответ
Вы пробовали метод viewWillTransitionToSize? Это используется для уведомления контейнера о том, что размер его представления вот-вот изменится.
Objective-C
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
Свифта
func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
coordinator.animateAlongsideTransition(nil, completion: {
if UIDevice.currentDevice().orientation.isLandscape.boolValue {
print("landscape")
} else {
print("portrait")
}
}
В соответствии с документацией UITraitEnvironment:
Система вызывает этот метод, когда изменяется IOS, интерфейс среды. Внедрите этот метод в представлении контроллеров и представлений в соответствии с потребностями вашего приложения, чтобы реагировать на такие изменения. Например, вы можете отрегулировать расположение подзонов контроллера вида, когда iPhone поворачивается с портретной ориентации на альбомную. По умолчанию этот метод пуст. В начале вашей реализации вызовите super, чтобы убедиться, что элементы интерфейса выше в иерархии представлений имеют возможность сначала отрегулировать свой макет.
Вы можете переопределить traitCollectionDidChange
в своем ViewController
.
Однако.
traitCollectionDidChange
Вызывается при переключении из одного режима просмотра сплита в другой. Например, с 50/50 до 33/66. Это так НЕ вызывается при входе в режим многозадачности или выходе из него.
Если вам нужно обрабатывать все события включая вход и выход из многозадачном режиме, используйте viewWillTransitionToSize:withTransitionCoordinator:
вместо:
// put this in your ViewController code
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// TODO: put your code here (runs BEFORE transition complete)
}
Если вы хотите, чтобы ваш код называется ПОСЛЕ переходную compelete:
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// TODO: put your code here (runs AFTER transition complete)
}];
}
Просто подскажите, кто это читает. 'traitCollectionDidChange' не всегда вызывается при изменении режима разделения, как вы сказали« от 50/50 до 33/66 ». Он будет вызываться только при изменении класса фактического размера. Например. если у вас есть iPad, а не iPad, и ваше приложение появится справа, traitCollectionDidChange не будет вызываться, потому что класс размера в обоих режимах будет Compact. –
Спасибо за этот комментарий! Только Apple может сделать простейшую вещь (изменение размера представления вида в этом случае) настолько сложной и неясной! –
traitCollectionDidChange работает отлично для меня для многозадачности iPad. – malhal
Если кто-то еще сомневается в том, что точка:
// This method called every time user changes separator position or when user rotates device
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
// Always call super in those methods
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
// Before this call your layout is old, status bar orientation will return value before rotation
[coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) {
// Code here will be executed during transform. Status bar orientation is new, your view size already changed (in general).
// Setup required animations or custom views transitions
}
completion:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
// Split view transition complete or device rotated
}];
}
Также существует метод traitCollectionDidChange:
, но он будет вызываться только при изменении размера горизонтального класса. Например, если ваше приложение отображается с правой стороны в режиме просмотра с разделом, traitCollectionDidChange:
не будет вызываться, когда пользователь изменит положение разделителя. Но если ваше приложение представления слева, она будет называться всегда в портретном режиме, а также в ландшафтном для переходов (50/50) <-> (66/33)
С точки зрения управления, мы должны называть
- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
, чтобы получить уведомление, когда ориентация/изменения нескольких окон.
Да, я пробовал. Это работает. Но я хочу получить уведомление, когда изменение закончится. В любом случае, спасибо. – RayChen
Вы добавили эту проверку в UIDevice.currentDevice(). Orientation.isLandscape.boolValue, это даст вам текущее состояние ориентации. Я обновил код на примере. –
Нет, я не проверял, что – RayChen