1

我正在开发一个自定义键盘,我正在尝试捕捉设备旋转事件。

我已经尝试过:

override func viewDidLayoutSubviews() {
    print("Foo")
}

override func viewWillLayoutSubviews() {
    print(" Bar")
}

override func didRotateFromInterfaceOrientation(sender : UIInterfaceOrientation){ 
    print("");
}

 override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    print("Bar")
}

override func updateViewConstraints() {
    super.updateViewConstraints()
    print(" Foo")
}

但它不起作用。

iPad Air 2 模拟器 - iOS9

任何想法 ?

4

3 回答 3

1

大多数与旋转相关的方法现在都已弃用。Apple 正在转向尺寸和特征更改通知,而不是直接的设备方向更改通知。

此外,UIDevice.currentDevice().orientation 总是在具有完全访问权限和 beginGeneratingDeviceOrientationNotifications 的键盘扩展中返回未知。

正确的方法(以及在文档中被列为已弃用方法的替代方法)是

- viewWillTransitionToSize:withTransitionCoordinator:

奇怪的是它对你不起作用。我刚刚在 iPad Air 2 iOS9 Simulator 上的 UIInputViewController 中尝试过它,它可以工作:

2015-10-13 12:28:15.347 [信息] [KeyboardViewController.swift:60] viewWillTransitionToSize( :withTransitionCoordinator:) > 旋转到大小 (1024.0, 313.0) 2015-10-13 12:28:20.512 [信息] [KeyboardViewController .swift:60] viewWillTransitionToSize( :withTransitionCoordinator:) > 旋转到大小 (768.0, 313.0)

你在调试正确的目标吗?要查看来自您的扩展的控制台消息,您必须将其设置为运行目标: 在此处输入图像描述

注意还有

- willTransitionToTraitCollection:withTransitionCoordinator:

但是这个不适用于 iPad,因为 iPad 总是常规的,横向和纵向都是常规的。

于 2015-10-13T11:03:24.093 回答
0

并非所有视图控制器都会接收到转换事件。我认为这取决于您的视图控制器是否位于 UINavigationController 或 UITabBarController 之类的容器控制器中,以及它们是否将更改传递给子控制器。

接收方向更改的保证方法是注册 UIDevice 方向更改通知。有关通知事件的列表,请参阅https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/#//apple_ref/c/data/UIDeviceOrientationDidChangeNotification

这是你在 ObjC 中要做的事情。应该很容易翻译成 Swift。

在您的应用程序委托中使用以下方式激活方向更改:

 [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];

在视图控制器中,您希望通知添加方法来处理通知,添加和删除观察通知。

// Method to be called when orientation notification is changed.
- (void)orientationDidChange:(NSNotification *)notification { 
  // Add your code to deal with the orientation.
  // You can get the current orientation for UIDevice as follows:

  UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];
}

// Adds observation of orientation change
-(void)addObserver
{
    [[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(orientationDidChange:) 
     name:@"UIDeviceOrientationDidChangeNotification" 
     object:nil];
}

// Removes observation of orientation change
-(void)removeObserver
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

将呼叫添加到addObserver适当removeObserver的位置。viewDidAppear例如viewDidDisappear

于 2015-10-12T11:38:19.000 回答
0

看起来这适用于我的 iOS 9 和 iPad Air 2 项目:

override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
    print("hi")
}

看起来你试过了,但它没有用......

于 2015-10-12T17:30:45.727 回答