2

iOS 8 用のカスタム キーボードを作成{{0, 0}, {0, 0}}しています。メインの UIView がメソッドで返されますviewDidLoad。view.frame と bounds を使用して CGRect を受信しようとしましたが、どちらも 0 を返します。ただし、同じメソッドを使用してメソッドでビューの座標を取得すると、正常viewDidAppearに返されます: {{0, 0}, {320, 216}}ここでの問題は、didLoad の後に viewDidAppear が実行されるため、didAppear からサイズを取得して didLoad で使用できないことです。これが私の質問です:

self.view のフレームが 0 を返すのはなぜviewDidLoadですか? そのサイズはすでにここに設定されているべきではありませんか? これ (viewDidLoad) は、初期化と UI 設定のほとんどを行うべき場所ですよね? Xcode の使用経験は中程度です。

私はこれをswiftでプログラミングしていますが、これは問題ではないはずですが(?)、注目に値すると思いました。Obj-C での回答は問題ありません。

編集:次のクラスでまったく新しい Xcode プロジェクトとターゲットを作成しましたが、同じエラーが発生します。

import UIKit

class KeyboardViewController: UIInputViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    println(self.view.frame) // returns (0.0,0.0,0.0,0.0)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

}

override func viewDidAppear(animated: Bool) {
    println(self.view.frame) // returns (0.0,0.0,320.0,216.0)
}


}

私は、シミュレーターと物理デバイスで 6 から 4S までの範囲でテストしました。何も違いはないようです。

4

3 に答える 3

1

viewDidLoad でフレーム サイズが正しくないのは、(キーボード拡張だけでなく) ビュー表示階層の一般的なプロパティです。こちらこちらを参照してください。レイアウトの処理方法に関するいくつかの提案も記載されています。

ほとんどの場合、フレーム変更の処理について心配する必要はありません。例 viewDidLoad

    MyKeyboardView* keyboardView = [[keyboardView alloc] init];
    keyboardView.translatesAutoresizingMaskIntoConstraints = NO;

    [self.inputView addSubview: keyboardView];

    NSLayoutConstraint *leftSideConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0];
    NSLayoutConstraint *rightSideConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0];
    NSLayoutConstraint *bottomConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:0.0];
    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:keyboardView attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.inputView attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0];

    [self.inputView addConstraints:@[leftSideConstraint, rightSideConstraint, bottomConstraint, topConstraint]];

このように、keyboardView のフレームは inputView フレーム (向きとデバイスのデフォルトのキーボード フレーム サイズに設定されています) を追跡し、向きの変化に合わせて自動的にサイズ変更されます。その後、MyKeyboardView クラスの layoutSubviews でさらにカスタム レイアウトを処理できます。最後に、MyKeyboardView が drawRect でカスタム描画を行う場合、MyKeyboardView の init で contentMode を設定する必要がありますself.contentMode = UIViewContentModeRedraw;。そうしないと、フレームの変更時に drawRect が呼び出されません。

于 2014-10-21T17:48:47.537 に答える