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 方法中添加您的自定义。在调用 super 的自定义类中添加 initWithCoder 方法并返回 [self initWithFrame:[self frame]]。然后在 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

好的,如果外观不起作用,那么您的下一个最佳选择是编写一个类别来为您执行此操作。

子类化是可能的,但并不理想,因为有可能覆盖你不应该覆盖的东西(反之亦然)。

将文件添加到您的项目并选择类别类型并将类设置为 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 回答
1

我同意 Fogmeister 对在代码中创建的文本字段的看法。但是,如果您在 Storyboard 中布置文本字段,则该方法将不起作用(因为每个字段都明确定义了其属性)。但是有一种简单的方法可以奏效。

右键单击您的故事板并“打开为..”源代码。这将 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 属性的文本字段,以及一个不具有您喜欢的 fontDescription 属性的文本字段。然后将要更改的 fontDescription 属性替换为好的相应属性。请务必将您的更改限制在字体、大小和背景等内容上。不要更改 id、rect 或任何其他需要对文本字段唯一的内容。

我希望这对你有用,它对我来说是一种非常方便的技术,可以确保我所有的文本字段都有一致的排版。

(要恢复正常视图,“打开为...”界面生成器 - 故事板)

祝你好运!

于 2012-10-08T18:36:04.537 回答