iOS實(shí)現(xiàn)帶文字的圓形頭像效果
下面就來(lái)實(shí)現(xiàn)一下這種效果 圓形頭像的繪制
先來(lái)看一下效果圖
分析一下:
1、首先是需要畫(huà)帶有背景色的圓形頭像
2、然后是需要畫(huà)文字
3、文字是截取的字符串的一部分
4、不同的字符串,圓形的背景色是不一樣的
5、對(duì)于中英文同樣處理,英文的一個(gè)字符和中文的一個(gè)漢字同樣算作一個(gè)字符
6、文字總是居中顯示
好 有了這樣幾點(diǎn) 我們就可以開(kāi)始畫(huà)圖了
看一下最終實(shí)現(xiàn)的效果圖
首先 ,我們需要自定義一個(gè)view當(dāng)做自定義頭像,在view的drawRect
方法中進(jìn)行圖像的繪制
@interface RoundHeadView() @property (nonatomic, copy) NSString *title;//需要繪制的標(biāo)題 @property (nonatomic, assign) CGFloat colorPoint;//用戶后面計(jì)算顏色的隨機(jī)值 //設(shè)置文字 - (void)setTitle:(NSString *)title; @end @implementation RoundHeadView -(instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor clearColor]; } return self; } @end
首先畫(huà)一個(gè)帶有背景顏色的圓形
-(void)drawRect:(CGRect)rect{ //一個(gè)不透明類(lèi)型的Quartz 2D繪畫(huà)環(huán)境,相當(dāng)于一個(gè)畫(huà)布,你可以在上面任意繪畫(huà) CGContextRef context = UIGraphicsGetCurrentContext(); [self caculateColor];//計(jì)算顏色 /*畫(huà)圓*/ CGContextSetRGBFillColor (context,_colorPoint, 0.5, 0.5, 1.0);//設(shè)置填充顏色 顏色這里隨機(jī)設(shè)置的,后面會(huì)根據(jù)文字來(lái)計(jì)算顏色 //填充圓,無(wú)邊框 CGContextAddArc(context, self.frame.size.width/2.0, self.frame.size.width/2.0, self.frame.size.width/2.0, 0, 2*M_PI, 0); //添加一個(gè)圓 CGContextDrawPath(context, kCGPathFill);//繪制填充 }
得到了不帶文字的圓形頭像
接下來(lái) 我們來(lái)畫(huà)文字
首先需要計(jì)算一下文字的尺寸
將文字設(shè)置進(jìn)來(lái)
- (void)setTitle:(NSString *)title{ _title = [[self subStringWithLendth:2 string:title] copy]; [self setNeedsDisplay];//調(diào)用這個(gè)方法 進(jìn)行重新繪制 view會(huì)重新調(diào)用drawRect方法 }
截取文字
/** 截取字符串,截取字符串最開(kāi)始的兩個(gè) 漢子和英文一樣處理 @param length 截取的字符長(zhǎng)度(漢子和英文同樣計(jì)算) @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; }
/** 計(jì)算文字的尺寸,在繪制圖像時(shí),保證文字總是處于圖像的正中 文字的尺寸可以自己計(jì)算 這里定義的是 寬度的1/3 我看使用起來(lái)比較合適 當(dāng)然 你可以自己定義的 @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
還需要做一步處理 就是根據(jù)文字的拼音或者其他的什么東西 來(lái)定義圖像的背景色 我這里就用拼音了
首先需要做的是獲取拼音
/** 獲取漢子拼音 @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:@""]; }
根據(jù)拼音計(jì)算顏色,隨即一個(gè)顏色 這個(gè)方法 我自己瞎想的 一個(gè)顏色 當(dāng)然你可以自己定義一個(gè)方法來(lái)計(jì)算顏色
/** 隨機(jī)一個(gè)顏色 填充圓形頭像的底色 根據(jù)字符的拼音計(jì)算出的顏色 */ - (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; } }
需要的 我們都處理好了 這下可以直接畫(huà)文字了 還是在drawRect
方法中
-(void)drawRect:(CGRect)rect{ //一個(gè)不透明類(lèi)型的Quartz 2D繪畫(huà)環(huán)境,相當(dāng)于一個(gè)畫(huà)布,你可以在上面任意繪畫(huà) CGContextRef context = UIGraphicsGetCurrentContext(); [self caculateColor];//計(jì)算顏色 /*畫(huà)圓*/ CGContextSetRGBFillColor (context,_colorPoint, 0.5, 0.5, 1.0);//設(shè)置填充顏色 // CGContextSetRGBStrokeColor(context,red,green,blue,1.0);//畫(huà)筆線的顏色 //填充圓,無(wú)邊框 CGContextAddArc(context, self.frame.size.width/2.0, self.frame.size.width/2.0, self.frame.size.width/2.0, 0, 2*M_PI, 0); //添加一個(gè)圓 CGContextDrawPath(context, kCGPathFill);//繪制填充 /*寫(xiě)文字*/ // CGContextSetRGBFillColor (context, 1, 0, 0, 1.0);//設(shè)置填充顏色 NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Arial-BoldMT" size:self.frame.size.width/3.0], NSFontAttributeName,[UIColor whiteColor],NSForegroundColorAttributeName, nil]; CGSize size = [self caculateLableSize]; CGFloat X = (self.frame.size.width-size.width)/2.0; CGFloat Y = (self.frame.size.height-size.height)/2.0; [self.title drawInRect:CGRectMake(X, Y, self.frame.size.width, self.frame.size.width) withAttributes:dic]; }
測(cè)試一下
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 20)]; label.text = @"文字不同,背景顏色也不會(huì)相同"; [self.view addSubview:label]; NSArray *strs = @[@"為我",@"樣的",@"好啊",@"H在",@"hc",@"2才",@"哈哈",@"打算打算打算的",@"還有人v",@"哈哈"]; for (int i=0; i<10; i++) { RoundHeadView *head = [[RoundHeadView alloc] initWithFrame:CGRectMake(30, 100+(40*i), 40, 40)]; [head setTitle:strs[i]]; [self.view addSubview:head]; }
總結(jié)
好了,到這就大功告成了,大家都學(xué)會(huì)了嗎?希望本文的內(nèi)容對(duì)各位iOS開(kāi)發(fā)者們能有所幫助,如果有疑問(wèn)大家可以留言交流。謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
IOS 解決UIButton 點(diǎn)擊卡頓/延遲的問(wèn)題
本文主要介紹 IOS UIButton, 這里給大家提供代碼實(shí)例作為參考,解決 UIButton 點(diǎn)擊卡頓或者延遲問(wèn)題,在開(kāi)發(fā) IOS 項(xiàng)目的小伙伴如果遇到這樣的問(wèn)題可以參考下2016-07-07IOS 開(kāi)發(fā)之PickerView自定義視圖的實(shí)例詳解
這篇文章主要介紹了IOS 開(kāi)發(fā)之PickerView自定義視圖的實(shí)例詳解的相關(guān)資料,這里提供實(shí)例幫助大家學(xué)習(xí)理解這部分知識(shí),需要的朋友可以參考下2017-08-08IOS 靜態(tài)庫(kù)打包流程簡(jiǎn)化詳細(xì)介紹
這篇文章主要介紹了IOS 靜態(tài)庫(kù)打包流程簡(jiǎn)化詳細(xì)介紹的相關(guān)資料,開(kāi)發(fā)好的靜態(tài)庫(kù)后需要手動(dòng)的合并.a文件,然后再拷貝相關(guān)的頭文件,接著把靜態(tài)庫(kù)和頭文件放在同一個(gè)文件里面打包發(fā)送給SDK的使用者,這里簡(jiǎn)化下流程,需要的朋友可以參考下2016-12-12iOS實(shí)現(xiàn)點(diǎn)贊動(dòng)畫(huà)特效
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)點(diǎn)贊動(dòng)畫(huà)特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01iOS中UILabel text兩邊對(duì)齊的實(shí)現(xiàn)代碼
本文通過(guò)一段實(shí)例代碼給大家介紹了ios中uilabel text兩邊對(duì)齊的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下2017-01-01Objective-C與Swift之間的互相調(diào)用和跳轉(zhuǎn)
這篇文章主要給大家介紹了關(guān)于Objective-C與Swift之間的互相調(diào)用和跳轉(zhuǎn)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05iOS通過(guò)Runtime實(shí)現(xiàn)友盟統(tǒng)計(jì)的實(shí)例代碼
本篇文章主要介紹了iOS通過(guò)Runtime實(shí)現(xiàn)友盟統(tǒng)計(jì)的實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06