2015-08-31 72 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