Insets這個名字有點讓人費解,其實它表示的是內容與控件邊界的距離,相當於CSS中的padding。
目前,在iOS的控件中,只看到UIButton可以設置Insets,對應的屬性是:contentEdgeInsets、titleEdgeInsets、imageEdgeInsets,它們接受的屬性類型都是UIEdgeInsets,可以由函數UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)構造。在xib中也有界面來對按鈕的這三個EdgeInsets屬性進行設置,分別是按鈕的Edge和 Inset屬性。
如果想設置UILable或UITextField中的文本離邊界的距離,無倫是在xib裡還是直接代碼的方式都無能為力,因為蘋果未開放相應的屬性讓你去控制,所以,我們只能自定義相應的控件。
首先來看看UILabel的子類InsetsLabel的實現代碼。
InsetsLabel.h
- #import <UIKit/UIKit.h>
-
- @interface InsetsLabel : UILabel
-
- @property(nonatomic) UIEdgeInsets insets;
-
- - (id)initWithFrame:(CGRect)frame andInsets:(UIEdgeInsets) insets;
- - (id)initWithInsets:(UIEdgeInsets) insets;
-
- @end
InsetsLabel.m
- #import "InsetsLabel.h"
-
- @implementation InsetsLabel
-
- @synthesize insets = _insets;
-
- - (id)initWithFrame:(CGRect)frame andInsets:(UIEdgeInsets)insets {
- self = [super initWithFrame:frame];
- if(self) {
- self.insets = insets;
- }
- return self;
- }
-
- - (id)initWithInsets:(UIEdgeInsets)insets {
- self = [super init];
- if(self) {
- self.insets = insets;
- }
- return self;
- }
-
- - (void)drawTextInRect:(CGRect)rect {
- return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.insets)];
- }
-
- @end
再來看看UITextField的子類InsetsTextField的實現代碼。
InsetsTextField.h
- #import <UIKit/UIKit.h>
-
- @interface InsetsTextField : UITextField
-
- @end
InsetsTextField.m
- #import "InsetsTextField.h"
-
- @implementation InsetsTextField
-
- //控制placeHolder的位置
- - (CGRect)textRectForBounds:(CGRect)bounds {
- return CGRectInset(bounds, 20, 0);
- }
-
- //控制文本的位置
- - (CGRect)editingRectForBounds:(CGRect)bounds {
- return CGRectInset(bounds, 20, 0);
- }
-
- @end
上面實現InsetsTextField的方式更像是借鑒的InsetsLabel的實現,其實對於 UITextField還有更好的實現方式,而且更簡單,因為這是UITextFiled本來就支持的做法。例如它可以讓你做出在文本框最前方固定放一個$符號,表示這個文本框是輸入金額的,這個$是不能被刪除的。確實,你可以在UITextField上貼個UILabel,然後文本框的光標後移,但這個顯得有點麻煩了。
UITextField可以直接設置leftView或rightView,然後文本輸入區域就在leftView和 rightView之間了。
- UITextField *textField = [[UITextField alloc] init];
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 25)];
- label.text = @"$";
- label.textColor = [UIColor darkGrayColor];
- label.backgroundColor = [UIColor clearColor];
- textField.frame = CGRectMake(0, 0, 180, 25);
- textField.borderStyle = UITextBorderStyleRoundedRect;
- textField.leftView = label;
- textField.leftViewMode = UITextFieldViewModeAlways;
- [self.view addSubview:textField];
- [label release];
- [textField release];