iOS 圓形頭像

iOS 顯示圓形頭像是一個比較常見的需求,之前面試的時候也有被問到。當(dāng)時答出來的是設(shè)置 CALayer 以及在 Storyboard 中設(shè)置,第二種沒有答出來?,F(xiàn)在把三種方法寫一下,效果圖如下:

CALayer

UIView 和 CALayer 的關(guān)系在這里不多說,CALayer 主要的作用是繪制。

目前假設(shè)一個 UIImageView 叫 avatarImageView,那么方法為:

// 設(shè)置 layer 以外的區(qū)域不顯示,默認(rèn)為 NO
avatarImageView.layer.masksToBounds = YES;
// 設(shè)置 layer 的圓角
avatarImageView.layer.cornerRadius = avatarImageView.bounds.size.height/2;
// 設(shè)置 layer 邊框顏色和寬度
avatarImageView.layer.borderWidth = 3.0;
avatarImageView.layer.borderColor = [UIColor whiteColor].CGColor;

Duartz2D

直接提供方法:

/**
 獲取圓形圖片

 @param originImage 原圖
 @param borderWidth 邊框?qū)挾? @param borderColor 邊框顏色
 @return 返回圓形圖片
 */
- (UIImage *)getRoundAvatar:(UIImage *)originImage borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor {
    // 定義新圖片的尺寸
    CGFloat bigImageWidth = originImage.size.width + 2 * borderWidth;
    CGFloat bigImageHeight = originImage.size.height + 2 * borderWidth;
    CGSize imageSize = CGSizeMake(bigImageWidth, bigImageHeight);
    // 開啟上下文
    UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
    // 取得當(dāng)前上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    // 設(shè)置邊框顏色
    [borderColor set];
    // 設(shè)置邊框
    CGFloat bigRadius = bigImageWidth / 2.0;
    CGFloat centerX = bigRadius;
    CGFloat centerY = bigRadius;
    CGContextAddArc(ctx, centerX, centerY, bigRadius, 0, M_PI * 2, 0);
    CGContextFillPath(ctx);
    // 設(shè)置小圓
    CGFloat smallRadius = bigRadius - borderWidth;
    CGContextAddArc(ctx, centerY, centerY, smallRadius, 0, M_PI * 2, 0);
    // 裁剪
    CGContextClip(ctx);
    // 畫圖
    [originImage drawInRect:CGRectMake(borderWidth, borderWidth, originImage.size.width, originImage.size.height)];
    // 獲取新圖片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    // 結(jié)束上下文
    UIGraphicsEndImageContext();
    return newImage;
}

調(diào)用方式:

[avatarImageView setImage:[self getRoundAvatar:[UIImage imageNamed:@"somePic.jpg"]
                                   borderWidth:3.0
                                   borderColor:[UIColor whiteColor]]];

Storyboard / Xib 設(shè)置

Identity inspector 中的 User Defined Runtime Attribute 添加如下信息:

這里其實(shí)和 CALayer 的設(shè)置方法一致。

但是因為 border color 的類型為 CGColor ,所以在這里設(shè)置并不會起作用,會始終為黑色。

總結(jié)

Storyboard 的可維護(hù)性不是太強(qiáng),一般不推薦使用;

CALayer 方式的代碼比較簡單,并且有一定的靈活性;

Duartz2D 代碼比較高,但是可擴(kuò)展性很高。

Demo 地址:RoundAvatarDemo - Objective-C

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,551評論 6 30
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,200評論 30 471
  • 在iOS中隨處都可以看到絢麗的動畫效果,實(shí)現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,141評論 5 13
  • 原文:http://www.raywenderlich.com/113768/adaptive-layout-tu...
    kitty123閱讀 3,564評論 2 3
  • iOS 實(shí)戰(zhàn)開發(fā)課程筆記 本貼旨在作為對極客班 《iOS 開發(fā)實(shí)戰(zhàn)》第五期期課程視頻重新學(xué)習(xí)的筆記。目標(biāo)是建立一個...
    黃穆斌閱讀 3,048評論 12 57