UITextField文字缩进等位置改变
只需创建一个UITextField
的子类,在子类中重写几个方法:
- (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; //右视图的位置
需要制定哪些位置就重写哪些方法,其中参数bounds
是UITextField
的bounds
。
Tips:使用CGRectInset(CGRect rect, CGFloat dx, CGFloat dy)
可以快速得到左右都距离rect
dx
距离、上下都距离rect
dy
距离的CGRect
对象。
UIButton的titleLabel与imageView等视图位置改变
- 方法一:与UITextField类似,创建子类,重写方法:
- (CGRect)backgroundRectForBounds:(CGRect)bounds; //背景
- (CGRect)contentRectForBounds:(CGRect)bounds; //内容
- (CGRect)titleRectForContentRect:(CGRect)contentRect; //titleLabel
- (CGRect)imageRectForContentRect:(CGRect)contentRect; //imageView
-
方法二:使用
titleEdgeInsets
与imageEdgeInsets
两个属性:
</br>
titleEdgeInsets
与 imageEdgeInsets
都是UIEdgeInsets
类型的对象,可以使用UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)
来得到,top
、left
、bottom
、right
分别指视图到每一边的距离。
但在 titleEdgeInsets
与 imageEdgeInsets
中,这四个值的含义又有点不同。
Tips:
titleEdgeInsets
与imageEdgeInsets
的四个值初始都是0。- 在设置完
title
和image
后,title
和image
的高度总是在button中居中的,它们的视图大小也是不会变的。- 如果要得到
button
的titleLabel
的大小,简单使用button.titleLabel.frame.size
你会发现得到的值是CGRectZero
,解决方法就是在获取size
之前先调用sizeToFit
。
做个示例:
[button.titleLabel sizeToFit];
CGSize titleSize = button.titleLabel.frame.size;
button.titleEdgeInsets = UIEdgeInsetsMake(10, 0, 0, 0);
UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, button.frame.size.height / 2.0 - titleSize.height / 2.0 + 10, button.frame.size.width, 1)];
line.backgroundColor = [UIColor blackColor];
[button addSubview:line];
这段代码看上去是让titleLabel
向下移动了10个单位,所以我在titleLabel
移动后的位置顶部画了条线。
附上结果:
大家一定发现了实际上titleLabel
的位置并没有向下移动了10个单位那么多。
原来,指定了titleEdgeInsets
的 top
为10,其实相当于button
的顶部缩短了10个单位,而titleLabel
高度要居中于button
,所以实际上titleLabel
只向下移动了5个单位,就像这样:
再次尝试将线上移5个单位,结果如下:
结论:若要 titleLabel
或 imageView
朝某个方向移动x
个单位,则需要把 titleEdgeInsets
或 imageEdgeInsets
中与方向对映的值改为2x
即可。
如果 title
和 image
都指定了,那么button
会将titleLabel
与 imageView
一起看为一个整体,而这个整体水平居中,例如:
了解了这个之后,就可以知道imageView
需要向右移动半个titleLabel
的宽度就可以水平居中,而titleLabel
需要向左移动半个imageView
的宽度就可以水平居中,再用上面提到的方法,就可以得到图片在上,文字在下的UIButton
了。
注意:当title
和image
都要指定时,必须让button
的宽高都大于两者宽高之和,不然titleLabel
就会被缩小。