多任务时不调用traitCollectionDidChange

时间:2015-12-07 07:21:08

标签: ios objective-c swift multitasking

我正致力于采用多任务来支持应用的拆分视图。但我发现app在右边时没有调用traitCollectionDidChange。有没有人对此有所了解?

5 个答案:

答案 0 :(得分:9)

您可以覆盖traitCollectionDidChange中的ViewController

<强>然而

从一种拆分视图模式切换到另一种拆分视图模式时,

traitCollectionDidChange被调用。例如从50/50视图到33/66。当您进入多任务模式或退出时,它会被 NOT 调用。

如果您需要处理所有活动,包括进入和退出多任务模式,请改为使用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)
    }

如果您希望代码名为 AFTER ,请转换竞争对手:

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

答案 1 :(得分:8)

您是否尝试过viewWillTransitionToSize方法?这用于通知容器其视图的大小即将发生变化。

<强>目标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")
    }
}

答案 2 :(得分: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)

答案 3 :(得分:1)

在视图控制器中,我们应该调用

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

在方向/多窗口视图更改时收到通知。

答案 4 :(得分:0)

根据UITraitEnvironment的文档:

当iOS界面环境发生变化时,系统会调用此方法。根据应用程序的需要在视图控制器和视图中实现此方法,以响应此类更改。例如,当iPhone从纵向旋转到横向时,您可以调整视图控制器的子视图的布局。此方法的默认实现为空。 在实现开始时,调用super以确保视图层次结构中较高的接口元素有机会首先调整其布局。