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;
    }
}
posted @ 2016-11-16 09:33  <瑾瑜>  阅读(395)  评论(0)    收藏  举报