2015-12-07 27 views

回答

6

您是否尝试过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") 
    } 
} 
+0

是的,我试过了。这很奏效。但是我想在更改结束时收到通知。不管怎样,谢谢。 – RayChen

+0

你在这里添加了这个检查UIDevice.currentDevice()。orientation.isLandscape.boolValue,这会给你当前的方向状态。我用一个例子更新了代码。 –

+0

不,我没有检查 – RayChen

0

作为每UITraitEnvironment文档:

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

9

您可以在您的ViewController中覆盖traitCollectionDidChange

但是,

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

只是提示谁读这个。当您像“你从50/50视图到33/66”那样改变分割模式时,并不总是调用“traitCollectionDidChange”。如果实际尺寸等级发生变化,它将被调用。例如。如果您有iPad,而不是iPad Pro,并且您的应用程序是从右侧出现的,则不会调用traitCollectionDidChange,因为两种模式下的大小类都是Compact。 –

+0

谢谢你的评论!只有苹果公司可以做出最简单的事情(在这种情况下处理视图尺寸变化)如此复杂和不清楚! –

+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 {

得到通知时,定向/多窗口视图更改。