文章导读:当我们想调整UITextField中所编辑文本位置与边框的距离时,我们可以通过以下方法实现,当然也可以调整提示文本的位置与边框的距离。
1:创建一个新的类,继承于UITextField
@interface MyTextField : UITextField
2:重写UItextField中提供的方法,这些方法在子类中实现之后会被自动调用,所以我们只需重写,不用再去调用。
这里使用到了
CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)
这个结构体,先做一下简单的介绍。这个结构体在文档中的注释是:
/* Inset `rect' by `(dx, dy)' -- i.e., offset its origin by `(dx, dy)', and
decrease its size by `(2*dx, 2*dy)'. */
大意为:矩形框会偏离原本坐标(dx,dy)的位置,就是说如果(dx,dy)是(3,4)那么就是沿着X轴的正方向移动3,向Y轴的正方向移动4。这里我们要注意到苹果屏幕的坐标是以左上方为原点,X轴向右为正,Y轴向下为正。那么第一个参数rect又是什么呢?它传递过来的是某个矩形框的CGRecct,为了保证这个框的中心位置不会偏移,会将矩形框偏移后的大小也同时进行调整,此时矩形框的宽高分别减少(2 * dx,2 * dy),当偏移量为(3,4)时,矩形框就减少(6,8)。(扩展:当然,dx和dy都也可以是负数,当他们是负数时就代表时往坐标轴的负方向移动,此时矩形框的大小会变大。当然这也是为了实现矩形框的中心坐标不会偏移的结果)
当然我们也可以自定义自己想要的结构体,对于这个结构体,就只是进行了一下简单的数学坐标变换和大小调整而已,目的时为了使的中心坐标不会偏移。
///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;
右视图的矩形框
一下两个方法是不能直接被调用的,如果想要定制自己想要的样式,可以重写这个方法
- (void)drawTextInRect:(CGRect)rect;
- (void)drawPlaceholderInRect:(CGRect)rect;
网友评论