2015-03-06 3 views
-1

Я создал метод, который я бы хотел вызвать в UITextField. Вот метод:Метод не вызывается для объекта для 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]; 

} 

Что я делаю неправильно?

ответ

2

В addBorderLayer: вам нужно добавить слой в текстовом поле после того, как вы установите его:

[tf.layer addSublayer:border]; 
1

Попробуйте переместить код на viewWillAppear, в какой момент он должен был иметь свои взгляды позиционированы и граница и т.д. будет быть верным.

Также добавьте слой в текстовое поле, как указано Грегом.

1

Вы создаете новый слой, но вы никогда не добавляете его в ui.

Вы хотите добавить его в слой целевого вида.

[tf.layer addSublayer:border]; 
2

Вы должны изменить слой своего текстового поля. Рассмотрим что-то вроде этого:

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

Вопрос в том, как и все остальные уже сказал, что вы на самом деле не добавляя слой к UITextField. Другие ответы хороши, но я думал, что я поделюсь чем-то, что может показаться немного более сложным, но, вероятно, сделает его более многоразовым, и это всегда хорошо.

Первым делом создать новую категорию для UIView называется UIView+layer и здесь мы имеем следующее:

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 

Теперь, если вы ничего не знаете вы, вероятно, задаетесь вопросом, почему мы сделали UIView вместо UITextField. Причина заключается в том, что мы делаем его многоразовым со всеми классами, которые являются подклассом UIView, и который включает в себя UITextField, поэтому все, что вам нужно сделать, это сделать #import "UIView+layer.h", а затем вы можете использовать эти методы для экземпляра вашего UITextField, так что в вашем случае вы теперь можно сделать только [self.emailTextField addBorder];, и он добавит границу к вашему UITextField, используя значения по умолчанию.

Я знаю, что это похоже на гораздо большую работу по сравнению с другими, но это просто делает его более многоразовым для большего количества классов, что подкласс UIView и повторное использование - это всегда код, когда дело доходит до кодирования.

Смежные вопросы