博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义UILabel UITextField 填充
阅读量:5161 次
发布时间:2019-06-13

本文共 3340 字,大约阅读时间需要 11 分钟。

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 的实现代码:

#import 
@interface SOInsetsLabel : UILabel@property(nonatomic)UIEdgeInsets insets;-(id)initWithFrame:(CGRect)frame andInsets: (UIEdgeInsets)insets;-(id)initWithInsets: (UIEdgeInsets)insets;@end
#import "SOInsetsLabel.h"@implementation SOInsetsLabel@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)];}@end

关键就是覆盖了 -(void) drawTextInRect: (CGRect) rect; 方法,在画  Label 的文本时分别设置文本与  Label 四个边的间隙,即画在 Label 内的一个小矩形内,这个例子提供了便利的构造函数,提供自己的 UIEdgeInsets 属性。另外,函数 UIEdgeInsetsInsetRect(CGRect, UIEdgeInsets) 应该是好理解的。
再看如何设置 UITextField 中文本到四边的间距,这里也可以定义自己的 InsetsTextField:

#import 
@interface SOInsetsTextField : UITextField@end
#import "SOInsetsTextField.h"@implementation SOInsetsTextField//控制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];

 

效果如下:

Unmi InsetsTextField
上面更像是借鉴的 InsetsLabel 的实现,其实对于 UITextField 还有更好的实现办法,而且更简单,因为 UITextFiled 原来就支持的做法。比如它可以让你做出在文本框最前方固定一个 $ 符号,表示这个文本框是输入钱的,第一个$ 是不能被删除的。确实,你可以在 TextField 上贴个 Label,然后文本框的光标后移,稍显麻烦了。
而 UITextField 可以直接设置 leftView 或 rightView, 然后文本输入区域就在 leftView 和 rightView 之间了,看例子:

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
它的效果呢就更酷了:
Unmi TextField LeftView RightView文本框的起始光标是从上图数字 1 位置开始的。
实际应用中,对于 UITextField 如果有类似的需求,我会毫不犹豫的使用 leftView/rightView 属性来设置。
参考:1. http://stackoverflow.com/questions/2694411/text-inset-for-uitextfield
            2. http://stackoverflow.com/questions/5674655/uitextfield-align-left-margin

转载于:https://www.cnblogs.com/allanliu/p/4828673.html

你可能感兴趣的文章
mac 火狐 下载 任何文件都是失败
查看>>
Run Shell Commands in Python
查看>>
数组与泛型(2)
查看>>
20145322 Exp5 Adobe阅读器漏洞攻击
查看>>
使用System.out.print/prilntln() 输出时存在的问题
查看>>
angular-messages.js信息验证的使用
查看>>
HDU ACM 2844 Coins (多重背包)----------------01背包,完全背包,多重背包模板
查看>>
Docker 命令大全
查看>>
Linux c 根据socket套接字获取当前监听的端口
查看>>
scala 16 包
查看>>
黑马程序员------oc中的基本框架Foundation
查看>>
springboot集成schedule(深度理解)
查看>>
人工智能学习 第一课
查看>>
AT3576 Popping Balls
查看>>
CF1088F Ehab and a weird weight formula
查看>>
[SCOI2012]喵星球上的点名——堪称十种方法做的题
查看>>
ios 友盟统计
查看>>
java 文件读写
查看>>
SSH密钥对登录的原理和实践
查看>>
0423上课练习(list、while、def)
查看>>