2015-12-07 2 views
6

Я работаю над принятием многозадачности для поддержки разделенного вида для приложения. Но я считаю, что traitCollectionDidChange не вызывается, когда приложение находится справа. Кто-нибудь имеет представление об этом?traitCollectionDidChange не вызывается при многозадачности

ответ

6

Вы пробовали метод 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") 
    } 
} 
+0

Да, я пробовал. Это работает. Но я хочу получить уведомление, когда изменение закончится. В любом случае, спасибо. – RayChen

+0

Вы добавили эту проверку в UIDevice.currentDevice(). Orientation.isLandscape.boolValue, это даст вам текущее состояние ориентации. Я обновил код на примере. –

+0

Нет, я не проверял, что – RayChen

0

В соответствии с документацией UITraitEnvironment:

Система вызывает этот метод, когда изменяется IOS, интерфейс среды. Внедрите этот метод в представлении контроллеров и представлений в соответствии с потребностями вашего приложения, чтобы реагировать на такие изменения. Например, вы можете отрегулировать расположение подзонов контроллера вида, когда iPhone поворачивается с портретной ориентации на альбомную. По умолчанию этот метод пуст. В начале вашей реализации вызовите super, чтобы убедиться, что элементы интерфейса выше в иерархии представлений имеют возможность сначала отрегулировать свой макет.

9

Вы можете переопределить 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) 
    }]; 
} 
+3

Просто подскажите, кто это читает. 'traitCollectionDidChange' не всегда вызывается при изменении режима разделения, как вы сказали« от 50/50 до 33/66 ». Он будет вызываться только при изменении класса фактического размера. Например. если у вас есть iPad, а не iPad, и ваше приложение появится справа, traitCollectionDidChange не будет вызываться, потому что класс размера в обоих режимах будет Compact. –

+0

Спасибо за этот комментарий! Только Apple может сделать простейшую вещь (изменение размера представления вида в этом случае) настолько сложной и неясной! –

+0

traitCollectionDidChange работает отлично для меня для многозадачности iPad. – malhal

2

Если кто-то еще сомневается в том, что точка:

// 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)

0

С точки зрения управления, мы должны называть

- (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {

, чтобы получить уведомление, когда ориентация/изменения нескольких окон.