5

それで、私はしばらくこのカスタム キーボードに取り組んできましたが、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: が正しい方法であると信じていますが、デバイスを回転させたときに呼び出されません...ここで助けてください。

ありがとう、

4

1 に答える 1

0

すでに修正されているかどうかはわかりませんが、サイズが変更された場合にのみ実行される if ブロックにコードを配置し、後で super viewWillLayoutSubviews を呼び出すことで、うまくいくと思われる解決策が見つかりました。

このように:

-(void)viewWillLayoutSubviews
{
  if(self.size.frame.width != self.someClassVariableToTrackWidth)
   {
       self.someClassVariableToTrackWidth = self.size.frame.width;
       //call stuff here
   }

[super viewWillLayoutSubviews];
}

これは常にハックな方法だったので、より良い解決策を探しています。見つけたら投稿します。

于 2014-07-26T15:55:18.620 に答える