2015-08-31 73 views
0

我只是Objective C中的初学者。我想创建只有底线边框的多个文本框。 为了这个,我克里特岛一个新的类customTextField 看看我的代码; -如何在多个文本框中创建底线边框

CustomTextField.m

- (id)init { 
CALayer *border = [CALayer layer]; 
CGFloat borderWidth = 2; 
border.borderColor = [UIColor grayColor].CGColor; 
border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, self.frame.size.height); 
border.borderWidth = borderWidth; 
[self.layer addSublayer:border]; 
self.layer.masksToBounds = YES; 

return self; 

} 

在我loginViewController.h

#import <UIKit/UIKit.h> 
#import "CustomTextField.h" 

@interface LoginViewController : UIViewController 
@property (strong, nonatomic) IBOutlet CustomTextField *txtFirstName; 
@property (strong, nonatomic) IBOutlet CustomTextField *txtLastName; 
@property (strong, nonatomic) IBOutlet CustomTextField *txtEmail; 
@property (strong, nonatomic) IBOutlet CustomTextField *txtPassword; 

@end 

loginViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad];  

    _txtFirstName = [[CustomTextField alloc]init]; 
    _txtLastName = [[CustomTextField alloc]init]; 
    _txtEmail = [[CustomTextField alloc]init]; 
    _txtPassword = [[CustomTextField alloc]init]; 


} 

我不知道我犯了错误。这段代码什么都不做。任何人都可以告诉我我做错了吗? 任何帮助或任何建议。

回答

0

尝试这样的:

self.layer.masksToBounds = YES; 
self.layer.borderColor = [UIColor grayColor].CGColor; 
self.layer.borderWidth = borderWidth; 

但是,你正在使用IBOulet,这意味着你的对象从故事板初始化,这样,那么你应该将代码移到awakeFromNib

- (void)awakeFromNib 
{ 
    self.layer.masksToBounds = YES; 
    self.layer.borderColor = [UIColor grayColor].CGColor; 
    self.layer.borderWidth = borderWidth; 
} 
+0

我不明白你的意思。 –

+0

你已经将你的对象实例化为'IBOulets',这意味着你将它们链接到故事板或xib文件中,对吧?那么你*不必*用这个'[[CustomTextField alloc] init]'来初始化它们,而不是将代码添加到' - (id)init'中,你应该将它移动到' - (void)awakeFromNib',在您的自定义类 –

+0

没有变化只有一个文本框更改其他保持不变。 –

0

添加您的.m文件中的私有边框图层属性

@property (strong, nonatomic) IBOutlet CALayer *borderLayer; 

重写layoutSubviews设置边框。

- (void)layoutSubViews { 
    [super layoutSubViews]; 
    if (self.borderLayer) { 
     self.borderLayer = [CALayer layer]; 
     [self.layer addSublayer:border]; 
    } 
    CGFloat borderWidth = 5.0f; 
    self.borderLayer.backgroundColor = color.CGColor; 
    self.borderLayer.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, borderWidth); 
} 

更新: 不要初始化viewDidLoad中的CustomTextField IBOutlets。只需在故事板中将他们的课程设置为CustomTextField即可!

+0

请问你能解释一下吗,该怎么办? –

+0

确定: 覆盖textField中的layoutSubviews。当视图需要调整大小时调用它。可能修复你的问题,没有边界。 – MarkHim

+0

或者你的代码甚至没有做任何事情?你在用故事板吗? – MarkHim

0

您使用的子类有故事板,如果你编程方式创建的所有按钮的代码会很好,但如果你想你的代码将正常工作与故事板和编程,那么你必须在你的CustomTextField.m

- (id)initWithFrame:(CGRect)frame 
{ 
    if ((self = [super initWithFrame:frame])) { 

     [self initialize]; 
    } 
    return self; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if ((self = [super initWithCoder:aDecoder])) { 
     // Initialization code 
    } 
    return self; 
} 

- (void) awakeFromNib 
{ 
    [super awakeFromNib]; 
} 

- (void) layoutSubviews 
{ 
    for (UIView *view in self.subviews) { 
     [view removeFromSuperview]; 
    } 
    [self initialize]; 
} 


- (instancetype)init 
{ 
    self = [super init]; 
    if (self) { 
     self = [self initWithFrame:self.frame]; 
    } 
    return self; 
} 

-(void)initialize 
{ 
    CALayer *border = [CALayer layer]; 
    CGFloat borderWidth = 2; 
    border.borderColor = [UIColor grayColor].CGColor; 
    border.frame = CGRectMake(0, self.frame.size.height - borderWidth, self.frame.size.width, self.frame.size.height); 
    border.borderWidth = borderWidth; 
    [self.layer addSublayer:border]; 
    self.layer.masksToBounds = YES; 
} 
使用此代码
+0

在'layoutSuviews'中调用'initialize'?这只是错误的。 'layoutSubviews'被多次调用,所以你最终每次都会添加一个新的'CALayer'。 – n00bProgrammer

+0

@ n00bProgrammer你没看到'[view removeFromSuperview];'layoutSubViews'' –

+0

我做过。我的假设是,这是为了别的。遍历'subviews'将**不会给你任何你添加的边界层。你将不得不遍历'sublayers'并找到特定的'borderLayer'。调试视图,你会看到你添加了多个'CALayer's。 – n00bProgrammer