0

CALayer 内にテキストフィールドを追加したいのですが、それを行うのに時間がかかりません。

コード:

-(void)drawInContext:(CGContextRef)ctx
{        
    NSLog(@"OK");
    UITextField *field = [[UITextField alloc] initWithFrame:CGRectMake(0,120, self.frame.size.width, 100)];
    [field setText:@"Test"];
    [self addSublayer:field.layer];
}

任意のアイデア、提案、良い実践 :) ?

4

2 に答える 2

1

UIView のサブクラスである UITextField を、CALayer の祖先を持つオブジェクトを期待する CALayer の子 (サブレイヤー) として配置する方法はありません。

ただし、UIView を継承し、UITextField を表示時に適切な場所に配置する CALayer のスーパービューを確実に見つけることができます。また、CALayer を UITextField のデリゲートとして設定して、入力時にコンテンツの同期を維持します (UITextFieldTextDidChangeNotification を参照)。通知または -textFieldDidEndEditing: UITextField のデリゲート メソッド)。

これはQuartz Composerでどのように見えるかです(Cocoa TouchではなくCocoaを使用)

編集モードの Quartz Composer

于 2013-03-25T15:44:18.897 に答える
0

良い練習:) ?

私の意見では、これは悪い習慣です。レイヤーはビューよりも下位レベルであり、このように混在させるべきではありません。この質問に示されているように、そうすると、考えもしなかった結果/副作用が生じる可能性があります。

すべての上位レベルに移動してレイヤーのアイデアをスキップし、UITextView をビューに配置するか、すべての下位レベルに移動して CATextLayer をレイヤーに配置する必要があります。CATextLayer は描画専用であり、編集用ではないことに注意してください。最初の応答者になる機能 (つまり、キーボード入力のサポート) を含む UITextField の動作が必要な場合は、ビューに固執することをお勧めします。


補足として、レイヤーにビューを追加する場所非常に悪い習慣です。drawInContext:描画にはやなどの描画方法を使用drawRect:する必要があります。これらは、潜在的に何度も呼び出される可能性のあるメソッドであり、その場合、非常に多くのビュー/レイヤーが相互に追加されることになります。

于 2014-02-12T14:39:03.810 に答える