文章導(dǎo)讀:當(dāng)我們想調(diào)整UITextField中所編輯文本位置與邊框的距離時(shí),我們可以通過以下方法實(shí)現(xiàn)构回,當(dāng)然也可以調(diào)整提示文本的位置與邊框的距離。
1:創(chuàng)建一個(gè)新的類,繼承于UITextField
@interface MyTextField : UITextField
2:重寫UItextField中提供的方法丙笋,這些方法在子類中實(shí)現(xiàn)之后會(huì)被自動(dòng)調(diào)用,所以我們只需重寫煌贴,不用再去調(diào)用御板。
這里使用到了
CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)
這個(gè)結(jié)構(gòu)體,先做一下簡(jiǎn)單的介紹牛郑。這個(gè)結(jié)構(gòu)體在文檔中的注釋是:
/* Inset `rect' by `(dx, dy)' -- i.e., offset its origin by `(dx, dy)', and
decrease its size by `(2*dx, 2*dy)'. */
大意為:矩形框會(huì)偏離原本坐標(biāo)(dx怠肋,dy)的位置,就是說如果(dx淹朋,dy)是(3笙各,4)那么就是沿著X軸的正方向移動(dòng)3,向Y軸的正方向移動(dòng)4础芍。這里我們要注意到蘋果屏幕的坐標(biāo)是以左上方為原點(diǎn)杈抢,X軸向右為正,Y軸向下為正仑性。那么第一個(gè)參數(shù)rect又是什么呢惶楼?它傳遞過來的是某個(gè)矩形框的CGRecct,為了保證這個(gè)框的中心位置不會(huì)偏移诊杆,會(huì)將矩形框偏移后的大小也同時(shí)進(jìn)行調(diào)整歼捐,此時(shí)矩形框的寬高分別減少(2 * dx,2 * dy)晨汹,當(dāng)偏移量為(3豹储,4)時(shí),矩形框就減少(6淘这,8)剥扣。(擴(kuò)展:當(dāng)然,dx和dy都也可以是負(fù)數(shù)铝穷,當(dāng)他們是負(fù)數(shù)時(shí)就代表時(shí)往坐標(biāo)軸的負(fù)方向移動(dòng)朦乏,此時(shí)矩形框的大小會(huì)變大。當(dāng)然這也是為了實(shí)現(xiàn)矩形框的中心坐標(biāo)不會(huì)偏移的結(jié)果)
?當(dāng)然我們也可以自定義自己想要的結(jié)構(gòu)體氧骤,對(duì)于這個(gè)結(jié)構(gòu)體呻疹,就只是進(jìn)行了一下簡(jiǎn)單的數(shù)學(xué)坐標(biāo)變換和大小調(diào)整而已,目的時(shí)為了使的中心坐標(biāo)不會(huì)偏移。
///place holder position
- (CGRect)placeholderRectForBounds:(CGRect)bounds
{
return CGRectInset(bounds, 8, 8);
}
// text position
- (CGRect)textRectForBounds:(CGRect)bounds {
return CGRectInset(bounds, 8,4);
}
// text position while editing
- (CGRect)editingRectForBounds:(CGRect)bounds {
return CGRectInset(bounds, 8, 4);
}
下面我們來看看UITextField中的以下的方法:
// drawing and positioning overrides
繪制和位置的重寫
1:- (CGRect)borderRectForBounds:(CGRect)bounds;
?? 返回邊緣的矩形框
- (CGRect)textRectForBounds:(CGRect)bounds;
? 文本的矩形框
- (CGRect)placeholderRectForBounds:(CGRect)bounds;
? 提示文本的矩形框
- (CGRect)editingRectForBounds:(CGRect)bounds;
? 編輯的矩形框
- (CGRect)clearButtonRectForBounds:(CGRect)bounds;
? 清除按鈕的矩形框
- (CGRect)leftViewRectForBounds:(CGRect)bounds;
? 左視圖的矩形框
- (CGRect)rightViewRectForBounds:(CGRect)bounds;
? 右視圖的矩形框
一下兩個(gè)方法是不能直接被調(diào)用的刽锤,如果想要定制自己想要的樣式镊尺,可以重寫這個(gè)方法
- (void)drawTextInRect:(CGRect)rect;
- (void)drawPlaceholderInRect:(CGRect)rect;