iOS - UIButton(UIEdgeInsets)/设置button上的文字和图片 在定义位置(中英文混排,获取字符串长度)
1. UIEdgeInsets 枚举
typedef struct UIEdgeInsets {
CGFloat top, left, bottom, right;
// specify amount to inset (positive) for each of the edges. values can be negative to 'outset'
} UIEdgeInsets;
2. 在UIButton中有三个对EdgeInsets的设置:
2.1 ContentEdgeInsets、titleEdgeInsets、imageEdgeInsets
@property(nonatomic) UIEdgeInsets contentEdgeInsets UI_APPEARANCE_SELECTOR;
// default is UIEdgeInsetsZero
@property(nonatomic) UIEdgeInsets titleEdgeInsets;
// default is UIEdgeInsetsZero
@property(nonatomic) BOOL reversesTitleShadowWhenHighlighted;
// default is NO. if YES, shadow reverses to shift between engrave and emboss appearance
@property(nonatomic) UIEdgeInsets imageEdgeInsets;
// default is UIEdgeInsetsZero
2.2 UIEdgeInsetsMake
里面的四个参数表示距离上边界、左边界、下边界、右边界的距离,默认都为零,title/image在button的正中央
UIKIT_STATIC_INLINE UIEdgeInsets UIEdgeInsetsMake(CGFloat top, CGFloat left, CGFloat bottom, CGFloat right) {
UIEdgeInsets insets = {top, left, bottom, right};
return insets;
}
例如:
self.view.backgroundColor = [UIColor blackColor];
//button的类型
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(100, 100,90, 90);//button的frame
button.backgroundColor = [UIColor cyanColor];//button的背景颜色
//[button setBackgroundImage:[UIImage imageNamed:@"man_64.png"] forState:UIControlStateNormal];
//在UIButton中有三个对EdgeInsets的设置:ContentEdgeInsets、titleEdgeInsets、imageEdgeInsets
//给button添加image
[button setImage:[UIImage imageNamed:@"IconHome@2x.png"] forState:UIControlStateNormal];
//设置image在button上的位置(上top,左left,下bottom,右right)这里可以写负值,对上写-5,那么image就象上移动5个像素
button.imageEdgeInsets = UIEdgeInsetsMake(5,13,21,button.titleLabel.bounds.size.width);
[button setTitle:@"首页" forState:UIControlStateNormal];//设置button的title
button.titleLabel.font = [UIFont systemFontOfSize:16];//title字体大小
//设置title的字体居中
button.titleLabel.textAlignment = NSTextAlignmentCenter;
//设置title在一般情况下为白色字体
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
//设置title在button被选中情况下为灰色字体
[button setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted];
//设置title在button上的位置(上top,左left,下bottom,右right)
button.titleEdgeInsets = UIEdgeInsetsMake(71, -button.titleLabel.bounds.size.width-50, 0, 0);
//[button setContentEdgeInsets:UIEdgeInsetsMake(70, 0, 0, 0)];
//设置button的内容横向居中。。设置content是title和image一起变化
//button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
[button addTarget:self action:@selector(tap) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
//button相应的事件
-(void)tap {
NSLog(@"tap a button");
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"hello" message:@"willingseal" delegate:self cancelButtonTitle:@"ok" otherButtonTitles: nil nil];
[alertView show];
}
2. iOS中英文混排,获取字符串长度(中文字符数)
将一个NSString类型字符串获取的长度转换成类似ASCII编码的长度,如汉字2个字节,英文以及符号1个字节这个功能。
用一个char*类型的字符串,然后自己遍历一遍,将它整理为类似ASCII编码的格式,用到 [NSString cStringUsingEncoding:NSUnicodeStringEncoding]函数获得一个const char*指针,然后对这个字符串进行遍历,遇/0就跳过,否则length+1,就可以解决此问题。
-(int)convertToInt:(NSString*)strtemp {
int strlength = 0;
char* p = (char*)[strtemp cStringUsingEncoding:NSUnicodeStringEncoding];
for (int i=0 ; i<[strtemp lengthOfBytesUsingEncoding:NSUnicodeStringEncoding] ;i++) {
if (*p)
{
p++;
strlength++;
}
else {
p++;
}
}
return (strength+1)/2;
}
3. iOS UITextField,UITextView中英文混排长度检测
- UITextField我们要在输入的时候检测用户输入的文字长度,当达到一定的限度的时候就限制输入了。首先我们添加一个观察。
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textFiledEditChanged:) name:@"UITextFiledEditchangeNotification" object:self.sendComment.commentTextFiled];
- 在这个方法里面我们需要做一些检测,刚开始我是这样做的
- (void)TextFiledEditChanged:(NSNotification *)obj{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
NSString *Lang = [[UITextInputMode currentInputMode] primaryLanguage];
if([Lang isEqualToString:@"zh-Hans"])
{
//简体中文输入,包括简体拼音,简体五笔,简体手写
UITextRange *selectedRange = [textField markedTextRange];
//获取高亮部分
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
//没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if(toBeString.length > 50 )
{
textField.text = [toBeString substringToIndex:50];
}
}
//有高亮选择的字符串,则暂不对文字进行统计和限制
else {}
}
//中文输入法以外的直接对其统计限制即可, 不考虑其他语种情况
else {
if(toBeString.length > 50 )
{
textField.text = [toBeString substringToIndex:50];
}
}
- 他的不足就是你的中文是50个汉字,英文也是50个字母,是不一样的,我们其实是一个汉字是相当于两个英文。下面的写法就OK了!
- (void)TextFiledEditChanged:(NSNotification *)obj{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncodeing(kCFStringEncodingGB_18030_2000);
NSData *da = [toBeString dataUsingEncoding:enc];
NSInteger dataLength = [da length];
if(dataLength > 12 )
{
int lll = (int)[toBeString length];
for (int z = 0; z < lll; z++) {
NSString *fromString = [toBeString substringToIndex:z];
NSStringEncoding enc2 = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData *da2FROM = [fromString dataUsingEncoding:enc2];
NSInteger fromDataLength2 = [da2FROM length];
if (fromDataLength2 == 12 ) {
textField.text = fromString;
}
}
}
else {
textField.text = toBeString;
}
}
- 其实这里有一个坑,就是string的length是和cString的length是不一样的,所以你在substringToIndex的时候要注意。
其实上面的写法也是错误的,因为是汉字模式的键盘,你的赋值操作就会出现问题,所以得加上高亮状态的的判断
- (void)TextFiledEditChanged:(NSNotification *)obj{
UITextField *textField = (UITextField *)obj.object;
NSString *toBeString = textField.text;
UITextRange *selectedRange = [textField markedTextRange];
UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
if (!position)
{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncodeing(kCFStringEncodingGB_18030_2000);
NSData *da = [toBeString dataUsingEncoding:enc];
NSInteger dataLength = [da length];
if(dataLength > 12 )
{
int lll = (int)[toBeString length];
for (int z = 0; z < lll; z++) {
NSString *fromString = [toBeString substringToIndex:z];
NSStringEncoding enc2 = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
NSData *da2FROM = [fromString dataUsingEncoding:enc2];
NSInteger fromDataLength2 = [da2FROM length];
if (fromDataLength2 == 12 ) {
textField.text = fromString;
}
}
else {
textField.text = toBeString;
}
}
else {
textField.text = toBeString;
}
}

浙公网安备 33010602011771号