简体   繁体   中英

Method not being called on object for UITextField

I have created a method that I would like to call on UITextField. Here is the method:

- (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;

}

Once I attempt to call the method it doesn't change my UITextField:

- (void)viewDidLoad {
    [super viewDidLoad];

    [self addBorderLayer:self.emailTextField];

}

What am I doing wrong?

addBorderLayer: ,需要将图层添加到文本字段:

[tf.layer addSublayer:border];

You should change the layer of your textfield. Consider something like this:

-(void) addBorderLayer:(UITextField *) tf 
{
    tf.layer.borderColor = [UIColor redColor].CGColor;
    tf.layer.borderWidth = 2;
    tf.layer.cornerRadius = 5;
}

The issue is as everyone else has said you aren't actually adding the layer to the UITextField . The other answers are all good but I thought I'd share a something that might seem a little more complicated but would probably make it more reusable and that's always good.

First thing is create a new category for UIView called UIView+layer and in here we'd have the following:

UIView+layer.h

@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 

UIView+layer.m

#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

Now if you don't know anything about categories you're probably wondering why we did UIView instead of UITextField . The reason being is that we are making it reusable with all classes that are a subclass of UIView and that includes UITextField so all you need to do is do #import "UIView+layer.h" and then you can use these methods for the instance of your UITextField so in your case you can now just do [self.emailTextField addBorder]; and it will add a border to your UITextField using the default values.

I know it looks like a lot more work compared to the others but this just makes it so it is more reusable across more classes that subclass UIView and re-usability is always a code thing when it comes to coding.

Try moving the code to viewWillAppear, at which point it should have had its views positioned and the bounds etc will be correct.

Also add the layer to the text field as pointed out by Greg.

You are creating the new layer, but you never add it to the ui.

You will want to add it to the target view's layer.

[tf.layer addSublayer:border];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM