一次设置所有UITextField的样式而不是每个ViewController的样式?

时间:2012-10-08 18:09:13

标签: objective-c ios uitextfield uitextview

我正在尝试设置所有文本字段:

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个文本字段。有没有一种简单的方法可以用同样的方式设置所有这些样式?其中一些甚至没有合成/命名。

谢谢!

5 个答案:

答案 0 :(得分:9)

1)如果您在代码中创建文件,我会创建一个工厂类,其界面如下:

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

2)如果使用Interface Builder 创建TextFields ,则可以在UITextField上编写一个仅实现awakeFromNib:的类别。在那里你做了所有的自定义。这不需要更改代码,也不需要在nib文件中进行更改。

答案 1 :(得分: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

答案 2 :(得分:2)

除了图层内容之外,您应该可以为所有属性执行此操作...

你的AppDelegate中的

添加类似......的方法

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

等等。

这将设置应用中所有UITextField实例的外观。 (只要你不在代码中覆盖它们)。

答案 3 :(得分:1)

好的,如果外观不起作用,那么你的下一个最好的选择就是写一个类别为你做这个。

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

将一个文件添加到项目中并选择Category类型并将该类设置为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(或者你的categoyr被称为。

然后在您的代码中用...替换您的代码

[_lastname_field configureTextFieldWithFrame:frameRect2];

这将运行您的类别功能。

答案 4 :(得分:1)

我同意Fogmeister在代码中创建的文本字段。但是如果你在Storyboards中布置文本字段,那么这种方法将不起作用(因为每个字段都明确定义了它的属性)。但有一种简单的方法可行。

右键单击故事板并“打开为...”源代码。这将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属性。请务必将更改限制为字体,大小和背景等内容。请勿更改id,rect或其他任何需要对文本字段唯一的内容。

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

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

祝你好运!