6

私はすべてのテキストフィールドを次のようにスタイルしようとしています:

CGRect frameRect2 = _lastname_field.frame;
frameRect2.size.height = 30;

_lastname_field.font = [UIFont fontWithName:@"AppleGothic" size:15];
_lastname_field.frame = frameRect2;
_lastname_field.backgroundColor= [UIColor whiteColor];
_lastname_field.layer.cornerRadius = 5.0;
[_lastname_field.layer setBorderColor: [[UIColor grayColor] CGColor]];
[_lastname_field.layer setBorderWidth: 1.0];
_lastname_field.clipsToBounds = YES;

そのフィールドは見栄えがします。唯一の問題は、アプリ全体で 50 以上のテキスト フィールドがあることです。それらすべてを同じようにスタイリングする簡単な方法はありますか? それらのいくつかは、合成/名前付けさえされていません。

ありがとう!

4

5 に答える 5

9

1)コード内でファイルを作成する場合、次のようなインターフェイスを持つファクトリ クラスを作成します。

@interface MyTextFieldFactory : NSObject
+ (UITextField*)createStyledTextField;
@end

2) Interface Builderを使用して TextFields を作成する場合、UITextField にカテゴリを記述できます。これは のみを実装しますawakeFromNib:。そこで、すべてのカスタマイズを行います。これにはコードの変更は必要なく、nib ファイル内の変更も必要ありません。

于 2012-10-08T18:48:23.413 に答える
3

UITextField をサブクラス化し、initWithFrame メソッドにカスタマイズを追加します。スーパーを呼び出して [self initWithFrame:[self frame]] を返すカスタム クラスに initWithCoder メソッドを追加します。次に、Interface Builder で各テキスト フィールドのクラスを変更します。

次のようになります。

// MyUITextField.h
@interface MyUITextField : UITextField {
    // Your IVars
}

@property (retain, readonly) float value;
@end

// MyUITextField.m
@implementation MyClass

- (id)initWithCoder:(NSCoder *)decoder {

    [super initWithCoder:decoder];
    return [self initWithFrame:[self frame]];
}

- (id)initWithFrame:(CGRect)frame {

    self = [super initWithFrame:frame];
    if (self) {
        // Your customization
    }
}

@end
于 2012-10-08T18:14:37.183 に答える
2

レイヤーのものを除くすべてのプロパティに対してこれを行うことができるはずです...

AppDelegate に次のようなメソッドを追加します...

- (void)changeAppearances
{
    [[UITextField appearance] setFont:[UIFont fontWithName:@"AppleGothic" size:15]];
    [[UITextField appearance] setBackgroundColor:[UIColor whiteColor]];
}

等々。

これにより、アプリ内のすべての UITextField インスタンスの外観が設定されます。(コードでそれらを上書きしない限り)。

于 2012-10-08T18:13:32.990 に答える
1

コードで作成されたテキストフィールドについては、Fogmeisterに同意します。ただし、ストーリーボードにテキストフィールドをレイアウトしている場合、そのアプローチは機能しません(各フィールドがそのプロパティを明示的に定義しているため)。しかし、うまくいく簡単な方法があります。

ストーリーボードを右クリックして、[名前を付けて開く]ソースコードを選択します。これにより、SBのXML表現がエディターウィンドウに表示されます。そこで、エディターを使用してテキストフィールドのプロパティをグローバルに(および/または選択的に)変更できます(または選択したXMLエディターにコピーします)。

公正な警告です。SBにエラーが発生してコンパイルが妨げられると、プロジェクトが強制終了される可能性があります。そのため、十分に注意して、SBのバックアップがあることを確認してください。ただし、変更するたびに確認すると、この手法は非常にうまく機能します。

" <textField"を検索して、次のようなものを見つけます。

<textField opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="center" borderStyle="roundedRect" placeholder="name" minimumFontSize="17" clearButtonMode="whileEditing" id="F9N-Tb-KTd">
                            <rect key="frame" x="176" y="301" width="472" height="31"/>
                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
                            <fontDescription key="fontDescription" type="system" pointSize="14"/>
                            <textInputTraits key="textInputTraits" autocapitalizationType="words" enablesReturnKeyAutomatically="YES"/>
                            <connections>
                                <action selector="changeName:" destination="4" eventType="editingDidEnd" id="bLg-iM-m8a"/>
                            </connections>
                        </textField>

必要なfontDescriptionプロパティを持つテキストフィールドとそうでないテキストフィールドを1つ見つけます。次に、変更するfontDescriptionプロパティを、適切なプロパティの対応するプロパティに置き換えます。変更は、フォント、サイズ、背景などに制限してください。id、rect、またはテキストフィールドに固有である必要があるその他のものは変更しないでください。

これがうまくいくことを願っています。すべてのテキストフィールドに一貫したタイポグラフィがあることを確認することは、私にとって非常に便利なテクニックです。

(通常のビューに戻るには、「名前を付けて開く...」Interface Builder-ストーリーボード)

幸運を!

于 2012-10-08T18:36:04.537 に答える
1

OK、外観が機能しない場合、次の最善の策は、これを行うためのカテゴリを作成することです.

サブクラス化は可能ですが、オーバーライドすべきではないものをオーバーライドする可能性があるため (またはその逆)、理想的ではありません。

プロジェクトにファイルを追加し、カテゴリ タイプを選択して、クラスを UITextField として設定します。

カテゴリに次のような関数を追加します...

- (void)configureTextFieldWithFrame:(CGRect)frame;

次に、.mファイルで...

- (void)configureTextFieldWithFrame:(CGRect)frame
{
    self.font = [UIFont fontWithName:@"AppleGothic" size:15];
    self.frame = frame;
    self.backgroundColor= [UIColor whiteColor];
    self.layer.cornerRadius = 5.0;
    [self.layer setBorderColor: [[UIColor grayColor] CGColor]];
    [self.layer setBorderWidth: 1.0];
    self.clipsToBounds = YES;
}

次に、必要なだけです#import UITextField+Configure.h(または、カテゴリが呼ばれるものは何でも。

次に、コードでコードを次のように置き換えます...

[_lastname_field configureTextFieldWithFrame:frameRect2];

これにより、カテゴリ関数が実行されます。

于 2012-10-08T18:26:33.893 に答える