iOS实现带文字的圆形头像效果

2020-01-18 16:47:08刘景俊

截取文字


/**
 截取字符串,截取字符串最开始的两个 汉子和英文一样处理
 @param length 截取的字符长度(汉子和英文同样计算)
 @param string 需要截取的字符串
 @return 返回截取的字符串
 */
-(NSString *)subStringWithLendth:(int)length string:(NSString *)string{
  
  NSString *copyStr = [string copy];
  NSMutableString *realStr = [[NSMutableString alloc] init];
  
  for(int i = 0; i < copyStr.length; i++){
    if(length == 0){
      break;
    }
    unichar ch = [copyStr characterAtIndex:0];
    if (0x4e00 < ch && ch < 0x9fff)//如何判断是汉字
    {
      //如果是汉子需要做其他处理 可以在这里做处理
    }
    //若为汉字
    [realStr appendString:[copyStr substringWithRange:NSMakeRange(i,1)]];
      
    length = length - 1;
  }
  return realStr;
}

/**
 计算文字的尺寸,在绘制图像时,保证文字总是处于图像的正中
 文字的尺寸可以自己计算 这里定义的是 宽度的1/3 我看使用起来比较合适 当然
 你可以自己定义的
 @return 文字的宽高
 */
- (CGSize)caculateLableSize{
  UILabel *lable = [[UILabel alloc] initWithFrame:CGRectZero];
  lable.font = [UIFont fontWithName:@"Arial-BoldMT" size:self.frame.size.width/3.0];
  lable.text = self.title;
  [lable sizeToFit];
  CGSize size = lable.frame.size;
  return size;
}

最后得到了 需要绘制在图像上的title

还需要做一步处理 就是根据文字的拼音或者其他的什么东西 来定义图像的背景色 我这里就用拼音了
首先需要做的是获取拼音


/**
 获取汉子拼音
 @param originalStr 原始中文字符
 @return 汉子的全拼
 */
- (NSString *)pinyin: (NSString *)originalStr{
  NSMutableString *str = [originalStr mutableCopy];
  CFStringTransform(( CFMutableStringRef)str, NULL, kCFStringTransformMandarinLatin, NO);
  CFStringTransform((CFMutableStringRef)str, NULL, kCFStringTransformStripDiacritics, NO);
  return [str stringByReplacingOccurrencesOfString:@" " withString:@""];
}

根据拼音计算颜色,随即一个颜色 这个方法 我自己瞎想的 一个颜色 当然你可以自己定义一个方法来计算颜色


/**
 随机一个颜色
 填充圆形头像的底色
 根据字符的拼音计算出的颜色
 */
- (void)caculateColor{
  if (_title.length == 0) {
    return;
  }
  if (_title.length>1) {
    NSString *firstStr = [_title substringWithRange:NSMakeRange(0,1)];
    NSString *secondStr = [_title substringWithRange:NSMakeRange(1, 1)];
    NSString *firstPinyin = [self pinyin:firstStr];
    NSString *secondPinyin = [self pinyin:secondStr];
    NSUInteger count = firstPinyin.length+secondPinyin.length;
    if (count>10) {
      count-=10;
      self.colorPoint = count/10.0;
    }else{
      self.colorPoint = count/10.0;
    }
  }else{
    NSString *firstStr = [_title substringWithRange:NSMakeRange(0,1)];
    NSString *firstPinyin = [self pinyin:firstStr];
    NSUInteger count = firstPinyin.length;
    self.colorPoint = count/10.0;
  }
}