11

CSS の :active または :focus 疑似クラスと同様に、UITextField が firstResponder になったときにその背景画像を変更して、ユーザーにフォーカスがあることを示したいと思います。

プログラムでこれを行う必要があるかもしれないと推測しています。どんな助けでも大歓迎です。

-ジャイルズ

4

4 に答える 4

29

私見の最もクリーンな方法は、サブクラス化UITextFieldしてオーバーライドbecomeFirstResponderresignFirstResponder、テキスト フィールドの背景画像を変更することです。そうすれば、デリゲート メソッドを再実装して背景を変更することなく、新しいサブクラスをどこでも使用できます。

- (BOOL)becomeFirstResponder {
    BOOL outcome = [super becomeFirstResponder];
    if (outcome) {
      self.background = // selected state image;
    }
    return outcome;
}

- (BOOL)resignFirstResponder {
    BOOL outcome = [super resignFirstResponder];
    if (outcome) {
      self.background = // normal state image;
    }
    return outcome;
}
于 2012-07-25T23:12:05.367 に答える
27

UITextFieldDelegate メソッドを使用することもできます (IMHO、キー値オブザーバーよりも保守が簡単です)。

#pragma mark -
#pragma mark UITextFieldDelegate methods

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    _field.background = [UIImage imageNamed:@"focus.png"];
    return YES;
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
    _field.background = [UIImage imageNamed:@"nofocus.png"];
    return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

これは、UITextField.borderStyle プロパティが UITextBorderStyleRoundedRect 以外のタイプの場合にのみ機能します (この場合、background プロパティは考慮されません)。これは、borderStyle ドキュメントで説明されているように、UITextBorderStyleBezel、UITextBorderStyleLine、および UITextBorderStyleNone で上記のコードを使用できることを意味します。

ボーダースタイル

テキスト フィールドで使用される境界線のスタイル。

@property(nonatomic) UITextBorderStyle ボーダースタイル

討論

このプロパティのデフォルト値は UITextBorderStyleNone です。カスタム背景画像が設定されている場合、このプロパティは無視されます。

これは、UITextField の background プロパティのドキュメントです。

バックグラウンド

テキスト フィールドが有効な場合の背景の外観を表すイメージ。

@property(非アトミック、保持) UIImage *背景

討論

設定すると、このプロパティによって参照される画像が、borderStyle プロパティによって制御される標準の外観を置き換えます。背景画像は、画像の境界矩形部分に描画されます。テキスト フィールドの背景に使用する画像は、収まるように伸縮できる必要があります。

于 2010-01-03T15:47:58.653 に答える
0

おそらく、isFirstResponder への変更を観察してみてください。通知方法の背景を変更します。何かのようなもの:

[textField addObserver:theObserver forKeyPath:@"isFirstResponder" options:0 context:nil];

次に、オブザーバーで:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if(object == textField && [keyPath isEqual:@"isFirstResponder"]) {
        //fiddle with object here
    }
}
于 2010-01-03T01:47:22.940 に答える