我创建了一个我想在UITextField上调用的方法。这是方法:
- (void)addBorderLayer:(UITextField *)tf{
CALayer *border = [CALayer layer];
CGFloat borderWidth = 2;
border.borderColor = [UIColor redColor].CGColor;
border.frame = CGRectMake(0, tf.frame.size.height - borderWidth, tf.frame.size.width, tf.frame.size.height);
border.borderWidth = borderWidth;
tf.layer.masksToBounds = YES;
}
一旦我尝试调用该方法,它就不会改变我的UITextField:
- (void)viewDidLoad {
[super viewDidLoad];
[self addBorderLayer:self.emailTextField];
}
我做错了什么?
答案 0 :(得分:2)
在addBorderLayer:
中,您需要在设置后将图层添加到文本字段:
[tf.layer addSublayer:border];
答案 1 :(得分:2)
您应该更改文本字段的图层。考虑这样的事情:
-(void) addBorderLayer:(UITextField *) tf
{
tf.layer.borderColor = [UIColor redColor].CGColor;
tf.layer.borderWidth = 2;
tf.layer.cornerRadius = 5;
}
答案 2 :(得分:2)
问题在于其他人都说你实际上并没有将图层添加到UITextField
。其他答案都很好,但我认为我会分享一些似乎有点复杂的东西,但可能会让它更可重复使用,而且总是很好。
首先要为名为UIView
的{{1}}创建一个新类别,在这里我们有以下内容:
<强>的UIView + layer.h 强>
UIView+layer
<强>的UIView + layer.m 强>
@interface UIView(layer)
- (void)addBorder;
- (void)addBorderWithColor:(UIColor *)color;
- (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width;
- (void)addBorderWithColor:(UIColor *)color radius:(CGFloat)radius;
- (void)addBorderWithWidth:(CGFloat)width;
- (void)addBorderWithWidth:(CGFloat)width radius:(CGFloat)radius;
- (void)addBorderWithRadius:(CGFloat)radius;
- (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width radius:(CGFloat)radius; // Essentially the one we will use
@end
现在,如果您对类别一无所知,那么您可能想知道我们为什么要#import "UIView+layer.h"
#pragma mark - Default values
// Some constants for the default values
CGFloat const kDefaultBorderWidth = 2.0;
CGFloat const kDefaultBorderRadius = 5.0;
UIColor * const kDefaultBorderColor = [UIColor blackColor];
@implementation UIView(layer)
// Essentially this is the method all the others will call.
- (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width radius:(CGFloat)radius
{
CALayer *border = [CALayer layer];
border.borderColor = color.CGColor;
border.frame = CGRectMake(0, self.frame.size.height - width, self.frame.size.width, self.frame.size.height);
border.borderWidth = width;
self.layer.masksToBounds = YES;
[self addSublayer:layer];
// OR you can affect the layer it already has like with the code below instead of using the addSublayer: method
// self.layer.borderColor = color.CGColor;
// self.layer.borderWidth = width;
// self.layer.frame = CGRectMake(0, self.frame.size.height - width, self.frame.size.width, self.frame.size.height);
}
#pragma mark - additional methods that you can call for setting a border
- (void)addBorder
{
[self addBorderWithColor:kDefaultBorderColor
width:kDefaultBorderWidth
radius:kDefaultBorderRadius];
}
- (void)addBorderWithColor:(UIColor *)color
{
[self addBorderWithColor:color
width:kDefaultBorderWidth
radius:kDefaultBorderRadius];
}
- (void)addBorderWithColor:(UIColor *)color width:(CGFloat)width
{
[self addBorderWithColor:color
width:width
radius:kDefaultBorderRadius];
}
- (void)addBorderWithColor:(UIColor *)color radius:(CGFloat)radius
{
[self addBorderWithColor:color
width:kDefaultBorderWidth
radius:radius];
}
- (void)addBorderWithWidth:(CGFloat)width
{
[self addBorderWithColor:kDefaultBorderColor
width:width
radius:kDefaultBorderRadius];
}
- (void)addBorderWithWidth:(CGFloat)width radius:(CGFloat)radius
{
[self addBorderWithColor:kDefaultBorderColor
width:width
radius:radius];
}
- (void)addBorderWithRadius:(CGFloat)radius
{
[self addBorderWithColor:kDefaultBorderColor
width:kDefaultBorderWidth
radius:radius];
}
@end
而不是UIView
。原因是我们正在使其成为UITextField
的子类并且包含UIView
的所有类可重用,所以您需要做的就是执行UITextField
然后您可以使用这些您#import "UIView+layer.h"
实例的方法,所以在您的情况下,您现在只需执行UITextField
,它将使用默认值为您的[self.emailTextField addBorder];
添加边框。
我知道它看起来比其他工作要多得多,但这只是因为它更可重用于更多类的子类UITextField
,并且在编码方面,可重用性总是一个代码
答案 3 :(得分:1)
尝试将代码移动到viewWillAppear,此时它应该放置其视图并且边界等是正确的。
同时将图层添加到Greg指出的文本字段中。
答案 4 :(得分:1)
您正在创建新图层,但您永远不会将其添加到ui。
您需要将其添加到目标视图的图层。
[tf.layer addSublayer:border];