iOS部分视图内容位置缩进解决方案

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;  //右视图的位置

需要制定哪些位置就重写哪些方法,其中参数boundsUITextFieldbounds
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
  • 方法二:使用titleEdgeInsetsimageEdgeInsets两个属性:

titleEdgeInsetsimageEdgeInsets都是UIEdgeInsets类型的对象,可以使用UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right)来得到,topleftbottomright分别指视图到每一边的距离。
但在 titleEdgeInsetsimageEdgeInsets中,这四个值的含义又有点不同。

Tips:

  1. titleEdgeInsetsimageEdgeInsets 的四个值初始都是0。
  2. 在设置完 titleimage 后,titleimage高度总是在button中居中的,它们的视图大小也是不会变的。
  3. 如果要得到 buttontitleLabel 的大小,简单使用 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移动后的位置顶部画了条线。
附上结果:

iOS部分视图内容位置缩进解决方案_第1张图片
1.png

大家一定发现了实际上titleLabel的位置并没有向下移动了10个单位那么多。
原来,指定了titleEdgeInsetstop 为10,其实相当于button的顶部缩短了10个单位,而titleLabel高度要居中于button,所以实际上titleLabel只向下移动了5个单位,就像这样:

iOS部分视图内容位置缩进解决方案_第2张图片
2.png

再次尝试将线上移5个单位,结果如下:

iOS部分视图内容位置缩进解决方案_第3张图片
3.png

结论:若要 titleLabelimageView 朝某个方向移动x个单位,则需要把 titleEdgeInsetsimageEdgeInsets 中与方向对映的值改为2x即可。

如果 titleimage 都指定了,那么button会将titleLabelimageView一起看为一个整体,而这个整体水平居中,例如:

iOS部分视图内容位置缩进解决方案_第4张图片
4.png

了解了这个之后,就可以知道imageView需要向右移动半个titleLabel的宽度就可以水平居中,而titleLabel需要向左移动半个imageView的宽度就可以水平居中,再用上面提到的方法,就可以得到图片在上,文字在下的UIButton了。

注意:titleimage都要指定时,必须让button的宽高都大于两者宽高之和,不然titleLabel就会被缩小。

你可能感兴趣的:(iOS部分视图内容位置缩进解决方案)