iOS 開發(fā)技巧--快速設(shè)置imageView形狀

我們在開發(fā)中,很多地方可能都會 imageView 的身影,尤其是應(yīng)用管理類的 app,包括一些社交類的用戶頭像. 如果簡單的把這些頭像或者應(yīng)用圖標(biāo)設(shè)置為正方形,總感覺不是那么的美觀,那么今天,我們一起看下該如何快速設(shè)置 imageView 形狀


為了方便以后使用,我把這些功能都封裝到一起了,以后可以直接拿來用
針對圓形形狀,我個人是先創(chuàng)建了一個繼承字UIImageCategory,頭文件聲明了兩個方法,一個類方法,一個對象方法

#import <UIKit/UIKit.h>

@interface UIImage (XFExtension)

/**
 *  返回圓形圖片
 */
- (instancetype)xf_circleImage;

+ (instancetype)xf_circleImage:(NSString *)name;

@end

在.m 文件里,先實現(xiàn)能返回圓形的對象方法

#import "UIImage+XFExtension.h"

@implementation UIImage (XFExtension)

- (instancetype)xf_circleImage {
    // 開啟圖形上下文
    UIGraphicsBeginImageContext(self.size);
    
    // 上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    
    // 添加一個圓
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextAddEllipseInRect(context, rect);
    
    // 裁剪
    CGContextClip(context);
    
    // 繪制圖片
    [self drawInRect:rect];
    
    // 獲得圖片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 關(guān)閉圖形上下文
    UIGraphicsEndImageContext();
    
    return image;
}

+ (instancetype)xf_circleImage:(NSString *)name {
    return [[self imageNamed:name] xf_circleImage];
}

@end

類方法的實現(xiàn)通過外界傳入的 image,返回一個圓形的

+ (instancetype)xf_circleImage:(NSString *)name { return [[self imageNamed:name] xf_circleImage];}

然后,我創(chuàng)建了一個繼承字UIImageViewCategory,這里的方法是真正開放給外界使用的,所以在頭文件中,我聲明了三個對象方法

#import <UIKit/UIKit.h>

@interface UIImageView (XFExtension)

/**
 *  圓形
 */
- (void)xf_setCircleHeaderWithUrl:(NSString *)url placeholder:(NSString *)placeholderName;

/**
 *  方形或者圓角型
 */
- (void)xf_setRectHeaderWithUrl:(NSString *)url placeholder:(NSString *)placeholderName;

/**
 *  六邊形
 */
- (void)xf_setSixSideHeaderWithUrl:(NSString *)url placeholder:(NSString *)placeholderName;

@end

接著在.m 文件里,一一實現(xiàn)這些方法
首先是圓形

/**
 *  圓形
 */
- (void)xf_setCircleHeaderWithUrl:(NSString *)url placeholder:(NSString *)placeholderName {
    // 讓占位圖片也是圓的
    UIImage *placeholderImage = [UIImage xf_circleImage:placeholderName];
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeholderImage completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        
        if (image == nil) return;
        
        self.image = [image xf_circleImage];
    }];
}

接著是方形或者圓角型

/**
 *  方形,也可以設(shè)置圓角
 */
- (void)xf_setRectHeaderWithUrl:(NSString *)url placeholder:(NSString *)placeholderName {
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:placeholderName] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        
        if (image == nil) return;
        
        self.layer.cornerRadius = 8.0;
        self.clipsToBounds = YES;
    }];
}

最后是六邊形

/**
 *  六邊形
 */
- (void)xf_setSixSideHeaderWithUrl:(NSString *)url placeholder:(NSString *)placeholderName {
    
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:[UIImage imageNamed:placeholderName] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
        
        if (image == nil) return;
        
        // 這個寬高要跟外面你要設(shè)置的 imageview 的寬高一樣
        CGFloat imageViewWH = 57;
        
        UIBezierPath * path = [UIBezierPath bezierPath];
        path.lineWidth = 2;
        [path moveToPoint:CGPointMake((sin(M_1_PI / 180 * 60)) * (imageViewWH / 2), (imageViewWH / 4))];
        [path addLineToPoint:CGPointMake((imageViewWH / 2), 0)];
        [path addLineToPoint:CGPointMake(imageViewWH - ((sin(M_1_PI / 180 * 60)) * (imageViewWH / 2)), (imageViewWH / 4))];
        [path addLineToPoint:CGPointMake(imageViewWH - ((sin(M_1_PI / 180 * 60)) * (imageViewWH / 2)), (imageViewWH / 2) + (imageViewWH / 4))];
        [path addLineToPoint:CGPointMake((imageViewWH / 2), imageViewWH)];
        [path addLineToPoint:CGPointMake((sin(M_1_PI / 180 * 60)) * (imageViewWH / 2), (imageViewWH / 2) + (imageViewWH / 4))];
        [path closePath];
        CAShapeLayer * shapLayer = [CAShapeLayer layer];
        shapLayer.lineWidth = 2;
        shapLayer.path = path.CGPath;
        self.layer.mask = shapLayer;
    }];
}

至此,方法聲明和實現(xiàn)已經(jīng)完成,接下來就是在相應(yīng)的位置,先導(dǎo)入頭文件,使用的時候就一句代碼就 OK 了

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor grayColor];
    
    // 測試圖片 url
    NSString *testUrl = @"http://bos.pgzs.com/itunesimg/31/351091731/c2dcc1bc41fa08a3a7ab3877e878b7a1_512x512bb.114x114-75.jpg";
    
    float viewWidth = 57;
    
    /*** 要設(shè)置圓形的 imageview */
    UIImageView *imageView = [[UIImageView alloc] init];
    imageView.frame = CGRectMake(70, 100, viewWidth, viewWidth);
    [imageView xf_setCircleHeaderWithUrl:testUrl placeholder:@"icon"];
    [self.view addSubview:imageView];
    
    /*** 要設(shè)置圓角型的 imageview */
    UIImageView *imageViewTwo = [[UIImageView alloc] init];
    imageViewTwo.frame = CGRectMake(150, 100, viewWidth, viewWidth);
    [imageViewTwo xf_setRectHeaderWithUrl:testUrl placeholder:@"icon"];
    [self.view addSubview:imageViewTwo];
    
    /*** 要設(shè)置六邊形的 imageview */
    UIImageView *imageViewThree = [[UIImageView alloc] init];
    imageViewThree.frame = CGRectMake(230, 100, viewWidth, viewWidth);
    [imageViewThree xf_setSixSideHeaderWithUrl:testUrl placeholder:@"icon"];
    [self.view addSubview:imageViewThree];
    
    
}

直接把所有代碼貼出來了,有了代碼,幾乎不用我廢話了
運行效果如下


我也不是什么大牛,很多東西也是 stackoverflow / Google,以及各種iOS大牛群里學(xué)來的,自認(rèn)為,學(xué)到就是賺到.哈哈

  • 最后奉上我的這些Category鏈接,如果你覺得有用,可以 down 下來.
  • 穿越至 github ---> XFCategory(里面還有我總結(jié)的一些其他 Category)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屯吊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盒卸,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件摘投,死亡現(xiàn)場離奇詭異虹蓄,居然都是意外死亡,警方通過查閱死者的電腦和手機薇组,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來专钉,“玉大人,你說我怎么就攤上這事跃须。” “怎么了菇民?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵第练,是天一觀的道長玛荞。 經(jīng)常有香客問我,道長勋眯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任塞蹭,我火速辦了婚禮讶坯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漱办。我一直安慰自己担汤,他們只是感情好崭歧,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布撞牢。 她就那樣靜靜地躺著,像睡著了一般所宰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上仔粥,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天躯泰,我揣著相機與錄音华糖,去河邊找鬼。 笑死客叉,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的卵慰。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼裳朋,長吁一口氣:“原來是場噩夢啊……” “哼再扭!你這毒婦竟也來了氧苍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤紊撕,失蹤者是張志新(化名)和其女友劉穎赡突,沒想到半個月后区赵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡笼才,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年骡送,在試婚紗的時候發(fā)現(xiàn)自己被綠了摔踱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡派敷,死狀恐怖撰洗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潜支,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布冗酿,位于F島的核電站络断,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏弱判。R本人自食惡果不足惜锥惋,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遭商。 院中可真熱鬧捅伤,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姜骡,卻和暖如春屿良,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背康栈。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工喷橙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬荣。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓氯迂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親言缤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,089評論 1 32
  • “所以你拿到離婚證了”,阿塵看著從民政局出來的我僻孝,“擺脫了你老婆,哦不對您单,前妻,感覺怎么樣悴务《孟蓿” “能怎么樣譬猫,就這樣...
    憶尋塵閱讀 246評論 1 1
  • 她是你 我不能想起讯檐,我不敢想起的一個人羡疗, 只是我會怕 那種生不如死的難受,
    小奧奧閱讀 176評論 0 2
  • 前幾天痒钝,我學(xué)習(xí)了簡七理財?shù)囊粋€簡單而有效的投資方法,根據(jù)她的數(shù)據(jù)計算痢毒,年華收益能達到14%以上送矩,而且穩(wěn)定,操作簡單...
    唯川閱讀 1,374評論 5 5
  • 女人熬夜的時候會覺得很累哪替,可是不管多累栋荸,中間最好不要上床休息,就似機器一樣凭舶,突然打開突然關(guān)上,對女性身體很不利匆背。 ...
    cqhfyy02閱讀 199評論 0 0