2015-04-08 23 views
2

我有一個UITextField,我正在申請一個底部邊框,使用下面的方法在UITextField類別:UITextField幀的寬度被返回得太短?

-(void)addBottomBorder { 
    CALayer *border = [CALayer layer]; 
    CGFloat borderWidth = 1; 

    // For the sake of visibility 
    border.borderColor = [UIColor redColor].CGColor; 
    self.backgroundColor = [UIColor whiteColor]; 

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

有趣的是,紅色的底邊框不跨越文本字段的整個寬度。

下面是該行爲的屏幕截圖。任何想法可能會導致這種情況? hmmm?

回答

3

如果您正在使用自動調整大小的屏蔽,比如可視寬度,textfield e.t.c,那麼應該在根據分辨率和自動調整大小約束成功調整視圖大小後添加邊框圖層。

你的情況的問題看起來像你有,你有申請文本的本尺寸和添加層文本字段被調整爲按自動調整大小的限制之後添加層的文本字段。但是圖層沒有按照約束調整大小,並且具有較早的維度,這會導致文本字段和邊框圖層之間的寬度差異。

要解決此問題,應在調整文本字段大小後添加邊框圖層。

可替代地,創建日提交文本下方的1個像素的UIView和設置它的水平自動尺寸調整掩模相同日提交的文本。

+1

我移動了將'viewDidLoad'邊框添加到'viewDidLayoutSubviews'的例程,因爲在應用約束之前確實添加了邊框。 – Timothy

0

嘗試設置後的顏色設置邊框寬度

0

那是邊框的層正在被遮蔽rightView問題?你可以嘗試在UIView表單中添加邊框作爲文本視圖的子視圖嗎?

1

這將是更容易地創建一個UIView是1P高,釘在底部和兩側用故事板的限制。根據我的理解,您的問題只發生在屏幕上的textField寬度大於其在故事板中的大小時發生,因爲textField在添加底線之後被拉伸,因此不會與該字段一起展開。

2

所以許多問題還有...

  • 如果你的UITextField將調整?
  • 如果會有leftView/rightView怎麼辦?它們掩蓋了底層視圖?
  • 如果您要添加子視圖,你應該使用bounds,不frame
  • 什麼,如果bounds.origin.x != 0bounds.origin.y

......最簡單的方法就是做Kristaps建議的事情。

0

子層不會自動定位。你不要佈置你的子圖層。

別惹文本字段,而不是把它包在裝飾視圖,並添加背景顏色或東西在底部2像素填充。

0

只需從viewDidLayoutSubviews

添加邊框繪圖調用內部setNeedsLayout而不是awakeFromNib

從視圖控制器調用子視圖的setNeedsLayout

然後如果有許多子視圖需要申請同樣的效果,這是更好地收集他們所有這些都在您創建的基類中的一個插座集合中。您將使用此基類繼承所有視圖控制器,包括您的自定義文本字段。

@interface FieldsViewController() 

@property (strong, nonatomic) IBOutletCollection(CustomTextField) NSArray *textFields; 

@end 

@implementation FieldsViewController 

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

- (void)viewDidLayoutSubviews { 
    for (CustomTextField *textField in self.textFields) { 
     [textField setNeedsLayout]; 
    } 
} 

@end