我可以观察 UIViewController 何时更改 interfaceOrientation 吗?

Posted

技术标签:

【中文标题】我可以观察 UIViewController 何时更改 interfaceOrientation 吗?【英文标题】:Can I observe when a UIViewController changes interfaceOrientation? 【发布时间】:2013-01-17 20:40:46 【问题描述】:

如果我有一个指向 UIViewController 的指针,是否可以在它更改 interfaceOrientation 时通知我而不修改控制器的代码?

最好的办法是检测设备方向的变化,然后查看 UIViewController 是否会/已经旋转(d)?

【问题讨论】:

不确定问题是否仍然存在,但您可以使用 objc 方法 swizzling 将您自己的代码添加到 UIViewController 的代码中。这应该看起来像用您自己的实现交换-didRotateFromInterfaceOrientation:,它调用了您的方向更改处理程序方法和对原始实现的调用 @medvedNick 这似乎是合理的。我可以打电话给我的代表,然后调用原始实现。我可能有点担心潜在的副作用。 【参考方案1】:

你可以使用 NSNotificationCenter :

 [[NSNotificationCenter defaultCenter] addObserver:self // put here the view controller which has to be notified
                                         selector:@selector(orientationChanged:)
                                             name:@"UIDeviceOrientationDidChangeNotification" 
                                           object:nil];
- (void)orientationChanged:(NSNotification *)notification  
    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    //do stuff
    NSLog(@"Orientation changed");          

【讨论】:

嗯。我想我不清楚。我想知道 ViewController 而不是设备的明显方向。换句话说,我的对象想要观察视图控制器以查看其方向,这可能与设备的方向不同,并且在设备改变方向时可能不会改变。这个答案是我在问题的第二部分中暗示的一部分。【参考方案2】:

您可以在 UIViewController 上使用 willAnimateRotationToInterfaceOrientation:duration: 方法,然后将任何 UIView(或任何其他代码)重新定位为横向或纵向。例如

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
  if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) 
    // change positions etc of any UIViews for Landscape
   else 
    // change position etc for Portait
  

  // forward the rotation to any child view controllers if required
  [self.rootViewController willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];

【讨论】:

不幸的是,这意味着更改 UIViewController 的代码。这里我只有一个指向它的指针,想观察它的行为。我真正想做的是在“interfaceOrientation”返回不同的值时得到通知。 注意:这在 ios 8 中已被弃用。***.com/questions/25238620/…

以上是关于我可以观察 UIViewController 何时更改 interfaceOrientation 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道在后台后何时显示 UIViewController 视图?

有没有办法知道何时呈现 UIViewController 失败?

使用 UICollectionViewCell 时,何时最好从属性中删除观察者?

检测 UIAlertController 何时被另一个 UIViewController 解除

如何观察何时显示 UIAlertView?

何时启动/加载 UIViewController 元素(通过 Main.storyboard 中的 IB 创建)?