(轉)設置 UILabel 和 UITextField 的 Padding 或 Insets (理解UIEdgeInsets)


轉自http://unmi.cc/uilable-uitextfield-padding-insets 主要是理解下UIEdgeInsets在IOS UI里的意義.
靠,這貨其實就是間隔,起個名字這么讓人費解!!!正值表示間隔值,負值表示超出參照物的距離。
--------------------------------------------------------分割線,下面是轉載原文---------------------------------------------------

iOS 的控件,只看到 UIButton 可以設置 Padding/Insets,即按鈕上文字或圖片與按鈕邊界的間隙,對與 CSS 來說叫做 Padding,在 iOS 中叫做 Insets,UIButton 設置 Insets 相應的屬性如下:

Configuring Edge Insets

      contentEdgeInsets  property
      titleEdgeInsets  property
      imageEdgeInsets  property 

它們接受的屬性類型是:UIEdgeInsets,由函數 UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right );     構造出,分別表示其中的內容/標題/圖片離各邊的距離。

在 xib 中也有界面來對按鈕的這三個 EdgeInsets 屬性的設置,分別是按鈕的 Edge 和 Inset 屬性。

印像中,Swing 的許多組件都可設置 Insets 屬性,可對於 iOS 的控件就沒那么幸運了,比如我想設置 UILable 或 UITextField 中的文本離邊界的間隙,無倫是在 xib 里還是直接代碼的方式都無能為力,因為它們根據未開放相應的屬性讓你去控制。

辦法當然還是有的,自定義相應自己的控件了,比如 InsetsLabel 或是  InsetsTextField,接着就是覆蓋某些個方法來達成。

首先來看 UILabel 的子類 InsetsLabel 的實現代碼:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//1.header file
#import <UIKit/UIKit.h>
 
@interface InsetsLabel : UILabel
@property ( nonatomic ) UIEdgeInsets insets;
-( id ) initWithFrame:(CGRect)frame andInsets: ( UIEdgeInsets ) insets;
-( id ) initWithInsets: ( UIEdgeInsets ) insets;
@end
 
//2. implementation file
#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)];
}

關鍵就是覆蓋了 -(void) drawTextInRect: (CGRect) rect; 方法,在畫  Label 的文本時分別設置文本與  Label 四個邊的間隙,即畫在 Label 內的一個小矩形內,這個例子提供了便利的構造函數,提供自己的 UIEdgeInsets 屬性。另外,函數 UIEdgeInsetsInsetRect(CGRect, UIEdgeInsets) 應該是好理解的。

再看如何設置 UITextField 中文本到四邊的間距,這里也可以定義自己的 InsetsTextField:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//
//  Created by Unmi on 11/2/11.
//  Copyright (c) 2011 http://unmi.cc. All rights reserved.
//
 
#import <UIKit/UIKit.h>
 
@interface InsetsTextField : UITextField
@end
 
@implementation InsetsTextField
//控制 placeHolder 的位置,左右縮 20
- (CGRect)textRectForBounds:(CGRect)bounds {
     return CGRectInset( bounds , 20 , 0 );
}
 
// 控制文本的位置,左右縮 20
- (CGRect)editingRectForBounds:(CGRect)bounds {
     return CGRectInset( bounds , 20 , 0 );
}
@end
 
//-----------------------------------------------------------------
//下面是使用 InsetsTextField 的代碼,可放在 viewDidLoad 等代理方法中
InsetsTextField *insetTextField = [[InsetsTextField alloc]
                                   initWithFrame:CGRectMake(10, 10, 180, 25)];
 
//須手動設置它的 borderStyle, 不然看不到邊框的
insetsTextField.borderStyle = UITextBorderStyleRoundedRect ;
[ self .view addSubview:insetsTextField];
[insetsTextField release];

效果如下:

上面更像是借鑒的 InsetsLabel 的實現,其實對於 UITextField 還有更好的實現辦法,而且更簡單,因為 UITextFiled 原來就支持的做法。比如它可以讓你做出在文本框最前方固定一個 $ 符號,表示這個文本框是輸入錢的,第一個$ 是不能被刪除的。確實,你可以在 TextField 上貼個 Label,然后文本框的光標后移,稍顯麻煩了。

而 UITextField 可以直接設置 leftView 或 rightView, 然后文本輸入區域就在 leftView 和 rightView 之間了,看例子:

1
2
3
4
5
6
UILabel *paddingView = [[ UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 25)];
paddingView.text = @ "$" ;
paddingView.textColor = [ UIColor darkGrayColor];
paddingView.backgroundColor = [ UIColor clearColor];
textfield.leftView = paddingView;
textfield.leftViewMode = UITextFieldViewModeAlways ;

rightView 也是一樣的設置方式,其中的  Mode 有四種,看到名字應該不難理解:

    UITextFieldViewModeNever,
    UITextFieldViewModeWhileEditing,
    UITextFieldViewModeUnlessEditing,
    UITextFieldViewModeAlways

它的效果呢就更酷了:

文本框的起始光標是從上圖數字 1 位置開始的。

實際應用中,對於 UITextField 如果有類似的需求,我會毫不猶豫的使用 leftView/rightView 屬性來設置。

參考:1. http://stackoverflow.com/questions/2694411/text-inset-for-uitextfield
            2. http://stackoverflow.com/questions/5674655/uitextfield-align-left-margin

本文鏈接 
http://unmi.cc/uilable-uitextfield-padding-insets, 來自 隔葉黃鶯 Unmi Blog


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM