それで、私はしばらくこのカスタム キーボードに取り組んできましたが、iOS 8 Beta 3 まではすべて問題ありませんでした。
iPhone ポートレート、iPhone ランドスケープ、iPad ポートレート、iPad ランドスケープ、iPhone 4 ポートレート用に 5 つの xib を作成しました。
テンプレートに基づいてカスタム キーボードを作成したときに作成された、私の KeyboardViewController:UIInputViewController 内。
どの xib をロードする必要があるかを判断するこのプライベート メソッドがあります。基本的には、画面の幅を確認してから、すべてのサブビューを削除して、新しいキーボード ビューを追加します。
- (void)viewWillLayoutSubviews
{
NSLog(@"[DEBUG] viewWillLayoutSubviews");
[super viewWillLayoutSubviews];
[self determineKeyboardNib:self.view.frame.size];
}
//
//- (void)viewDidLayoutSubviews
//{
// NSLog(@"[DEBUG] viewDidLayoutSubviews");
// [super viewDidLayoutSubviews];
// [self determineKeyboardNib:self.view.frame.size];
//}
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
NSLog(@"[DEBUG] viewWillTransitionToSize:withTransitionCoordinator:");
[super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self determineKeyboardNib:size];
}
/*
* Determine which xib file to load based on the width of the screen
*/
- (void) determineKeyboardNib: (CGSize)size
{
NSLog(@"[DEBUG] determineKeyboardNib: Enter if");
KeyboardIBBackend *keyboard_view;
// determine device
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPad");
// iPad
if (size.width > 1000) {
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPad Landscape");
// landscape
keyboard_view = [KeyboardIBBackend keyboardiPadLandscapeView];
}else{
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPad Portrait");
// portrait
keyboard_view = [KeyboardIBBackend keyboardiPadPortraitView];
}
}else{
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone");
// iPhone
if (size.width > 500){
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone Landscape");
// landscape
keyboard_view = [KeyboardIBBackend keyboardiPhone5LandscapeView];
}else if(size.width > 450){
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone 4 Portrait");
// portrait
keyboard_view = [KeyboardIBBackend keyboardiPhone4LandscapeView];
}else{
NSLog(@"[DEBUG] determineKeyboardNib: Enter iPhone 5 Portrait");
keyboard_view = [KeyboardIBBackend keyboardiPhonePortraitView];
}
}
NSLog(@"[DEBUG] determineKeyboardNib: Exit if");
keyboard_view.parentview = self;
// remove previous keyboard view
for (UIView *v in [self.view subviews]) {
[v removeFromSuperview];
}
// add the newly determined view
NSLog(@"[DEBUG] determineKeyboardNib: before addSubview");
[self.view addSubview:keyboard_view];
NSLog(@"[DEBUG] determineKeyboardNib: after addSubview");
}
まず、このメソッドを - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator に入れようとしましたが、ベータ 2 またはベータ 3 に関係なく呼び出されません。
結果として、私はそのメソッドを viewWillLayoutSubviews: に入れました。ベータ 3 より前では魅力的に機能していました。
Beta 3 では、デバイスを回転させると、viewWillLayoutSubviews が無期限に呼び出されます。detemineKeyboardNib メソッドでは、最後の行が
[self.view addSubview:keyboard_view]
これにより、viewWillLayoutSubviews が何度も呼び出された可能性があります。ただし、ベータ 2 ではそうではありませんでした。
次に、上記と同じように、viewDidLayoutSubviews内でdeterminKeyboardNibを取得しようとしました。
Beta 3 でデバイスの回転を処理する正しい方法は何だろうと思っています。viewWillTransitionToSize:withTransitionCoordinator: が正しい方法であると信じていますが、デバイスを回転させたときに呼び出されません...ここで助けてください。
ありがとう、