給Button添加特定個(gè)數(shù)的圓角

前言

寫代碼的時(shí)候遇到一個(gè)問題允睹,需要給一個(gè)按鈕設(shè)置左邊兩個(gè)圓角棉圈,右邊為直角榕酒,網(wǎng)上找了一些資料胚膊,發(fā)現(xiàn)有些確實(shí)是可以自定義圓角的位置的。

比如:大部分資料都是想鹰,使用UIBezierPath和CAShapeLayer來設(shè)置view的mask

UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(120,10,80,80)];
view2.backgroundColor = [UIColor redColor];
[self.view addSubview:view2];

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view2.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10,10)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view2.bounds;
maskLayer.path = maskPath.CGPath;
view2.layer.mask = maskLayer;

但是有一點(diǎn)紊婉,我在項(xiàng)目中是使用Masonry來添加約束的,前面代碼有效果的前提是:view的frame需要在添加之前就確定下來辑舷!喻犁,而Masonry則是使用block回調(diào)來約束的,所以:使用Masonry的UI代碼何缓,上面的是沒有效果的V !碌廓!

經(jīng)過查閱資料传轰,原來:
使用masonry的實(shí)質(zhì)還是調(diào)用了ios7以后的autolayout,如果要更新frame谷婆,需要調(diào)用layoutIfNeeded函數(shù)進(jìn)行布局路召,然后所約束的控件才會(huì)按照約束條件,生成當(dāng)前布局相應(yīng)的frame和bounds波材。這樣就可以利用這兩個(gè)屬性來進(jìn)行圖片圓角剪裁。而調(diào)用layoutIfNeeded的目的是讓系統(tǒng)調(diào)用layoutSubviews方法身隐,我們也可以直接在這個(gè)方法里獲取frame廷区,因?yàn)檫@時(shí)候開始layout subviews,Masonry已經(jīng)計(jì)算出了真實(shí)的frame贾铝。
所以隙轻,上面的代碼埠帕,如果使用Masonry,則要改成:

UIView *view2 = [[UIView alloc]init];
view2.backgroundColor = [UIColor redColor];
[self.view addSubview:view2];
[view2 mas_makeConstraints:^(MASConstraintMaker *make) {
    make.size.mas_equalTo(CGSizeMake(100, 40));
    make.left.equalTo(self.view).offset(100);
    make.top.equalTo(self.view).offset(100);
}];

//調(diào)用此方法,后面代碼才會(huì)起作用
[view2 layoutIfNeeded];

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view2.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10,10)];

CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view2.bounds;
maskLayer.path = maskPath.CGPath;
view2.layer.mask = maskLayer;

其實(shí)玖绿,實(shí)際中的我的代碼是這樣的:

    self.plusBtn = [WDTools createButtonWithTitle:@"+" frame:CGRectZero target:self selector:@selector(plusAction)];
    [self addSubview:self.plusBtn];
    [self.plusBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.equalTo(self);
        make.top.equalTo(self);
        make.height.equalTo(self);
        make.width.equalTo(self).multipliedBy(0.35);
    }];
    [self.plusBtn layoutIfNeeded];
    UIBezierPath *maskPath2 = [UIBezierPath bezierPathWithRoundedRect:self.plusBtn.bounds byRoundingCorners:UIRectCornerBottomRight | UIRectCornerTopRight cornerRadii:CGSizeMake(10, 10)];
    CAShapeLayer *maskLayer2 = [[CAShapeLayer alloc] init];
    maskLayer2.frame = self.plusBtn.bounds;
    maskLayer2.path = maskPath2.CGPath;
    
    self.plusBtn.layer.mask = maskLayer2;
    self.plusBtn.layer.borderColor = DDColorRandom.CGColor;
    self.plusBtn.layer.borderWidth = 2;

但是效果呢敛瓷?

這里寫圖片描述

可以看出,我是想要給這個(gè)按鈕添加一個(gè)Border的斑匪,但是用了上述的方法呐籽,并不能達(dá)到我要的效果!J慈场狡蝶!

如果有知道的大神們,也請給個(gè)指點(diǎn)贮勃!謝謝贪惹!

結(jié)果

我就怒從心頭起,惡向膽邊生寂嘉,于是我就自己寫了一個(gè)Button的子類.
看效果吧奏瞬!


這里寫圖片描述
    RoundedCornerButton *test = [[RoundedCornerButton alloc]init];
    [test setTitle:@"-" forState:UIControlStateNormal];
    test.direction = kCornerDirectionTopLeft | kCornerDirectionBottomLeft;
    test.roundedCornerRadius = 5.f;
    test.strokeWidth = 1.f;
    test.strokeColor = DDColorRandom;
    test.backgroundColor = DDColorRandom;
    [test addTarget:self action:@selector(minusAction) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:test];
    [test mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self);
        make.top.equalTo(self);
        make.height.equalTo(self);
        make.width.mas_equalTo(40);
    }];

顯然,我這里同時(shí)設(shè)置了邊框的顏色泉孩,和背景色硼端,但是這兩個(gè)是不會(huì)產(chǎn)生影響的。

typedef NS_ENUM(NSInteger,CornerDirection) {
    kCornerDirectionTopLeft     = 1 << 0,
    kCornerDirectionTopRight    = 1 << 1,
    kCornerDirectionBottomLeft  = 1 << 2,
    kCornerDirectionBottomRight = 1 << 3,
};

@interface RoundedCornerButton : UIButton
//圓角方向
@property (assign, nonatomic) CornerDirection direction;
//圓角半徑
@property (assign, nonatomic) CGFloat roundedCornerRadius;
//邊線寬度
@property (assign, nonatomic) CGFloat strokeWidth;
//邊線顏色
@property (strong, nonatomic) UIColor *strokeColor;

@end

接口方面棵譬,不能再簡單显蝌,就不多說了,
這里傳到Github上,感覺有幫助的請給個(gè)star! 謝謝订咸!

PS

這里還有一個(gè)以前寫的類似的設(shè)置按鈕背景色為漸變色的曼尊,還有一個(gè)給View添加指定數(shù)量的border的,有需要的可以看一下脏嚷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骆撇,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子父叙,更是在濱河造成了極大的恐慌神郊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趾唱,死亡現(xiàn)場離奇詭異涌乳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甜癞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進(jìn)店門夕晓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悠咱,你說我怎么就攤上這事蒸辆≌髁叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵躬贡,是天一觀的道長谆奥。 經(jīng)常有香客問我,道長拂玻,這世上最難降的妖魔是什么酸些? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮纺讲,結(jié)果婚禮上擂仍,老公的妹妹穿的比我還像新娘。我一直安慰自己熬甚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著盲赊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敷扫。 梳的紋絲不亂的頭發(fā)上葵第,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天缀台,我揣著相機(jī)與錄音膛腐,去河邊找鬼哲身。 笑死律罢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歌逢。 我是一名探鬼主播砰苍,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吼旧!你這毒婦竟也來了圈暗?” 一聲冷哼從身側(cè)響起员串,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抄谐,失蹤者是張志新(化名)和其女友劉穎斯稳,沒想到半個(gè)月后挣惰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體珍语,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年蛋铆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玛瘸。...
    茶點(diǎn)故事閱讀 40,021評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡慧脱,死狀恐怖磷瘤,靈堂內(nèi)的尸體忽然破棺而出针炉,到底是詐尸還是另有隱情篡帕,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站固蛾,受9級特大地震影響结执,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜艾凯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜡感。 院中可真熱鬧,春花似錦、人聲如沸犀斋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奶栖,已是汗流浹背匹表。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宣鄙,地道東北人苇羡。 一個(gè)月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像鼻弧,于是被迫代替她去往敵國和親设江。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,974評論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫温数、插件绣硝、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評論 4 62
  • 項(xiàng)目里的布局一直都是純代碼流,順帶著Autolayout也一直沒有使用撑刺,直到遇到了masonry鹉胖,讓我看到了希望,...
    小笨狼閱讀 9,278評論 25 128
  • http://www.reibang.com/p/f6cf9ef451d9 本文我們將提到: aotulayout...
    ai___believe閱讀 3,922評論 0 3
  • 有的人如酒挠铲, 初品, 苦澀寂诱、辛辣拂苹; 再品,醇香痰洒、如醉瓢棒, 于是,成了戒不掉的癮丘喻。 有的人如糖脯宿, 第一口,甜蜜泉粉; 第二...
    東坡瑯閱讀 174評論 0 1
  • 昨天晚上跟妹妹去看了歐陽娜娜的生日音樂會(huì)连霉,在北京的世紀(jì)劇院,場地不大嗡靡,也沒有過多的裝飾跺撼,就這樣簡簡單單的開始,簡簡...
    桐呦呦閱讀 272評論 0 1