Mac OS X下實現(xiàn)矩形部分圓角

問題

在進行今天的內(nèi)容之前箫踩,首先我想問一個問題:下圖中傻工,藍色選擇框與紅色選擇框除顏色鲜戒、大小外有何不同?(我會在后文揭曉答案)

圖1

目標

本文今天要討論的是:在Mac OS X下粟按,如何實現(xiàn)矩形的部分圓角诬滩。

比如這樣:

圖2

或者這樣:

圖3

解決方案

要想實現(xiàn)上圖樣式,有兩種解決方案灭将。

方案1:蠢萌描點法

蠢萌描點法實現(xiàn)圖2的原理圖如下:

蠢萌描點法原理圖

如上圖所示疼鸟,首先確定整個矩形的的幾個特殊點,然后通過CGContextAddLineToPoint來實現(xiàn)繪制庙曙。

核心代碼

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    
    CGMutablePathRef path = CGPathCreateMutable();
    CGContextRef cr = [[NSGraphicsContext currentContext] graphicsPort];
    
    CGContextAddPath(cr, path);
    //為了照顧視力不好的童鞋空镜,我將圖2的坐標擴大了10倍。
    //順時針將坐標填充入?yún)?shù)即可
    CGContextMoveToPoint(cr, 0, 0);
    CGContextAddLineToPoint(cr, 0, 150);
    CGContextAddArcToPoint(cr,
                           0, 180,
                           30, 180,
                           30);
    CGContextAddLineToPoint(cr, 270, 180);
    CGContextAddArcToPoint(cr,
                           300, 180,
                           300, 150,
                           30);
    CGContextAddLineToPoint(cr, 300, 0);
    CGContextAddLineToPoint(cr, 0, 0);
    
    CGContextSetRGBFillColor(cr, 255.0/255.0, 0.0/255.0, 0.0/255.0, 1);
    CGContextDrawPath(cr, kCGPathFill);
    
    CGPathRelease(path);
}

效果

蠢萌描點法效果

根據(jù)寫代碼來看捌朴,蠢萌描點法手法過于粗糙吴攒,我不會告訴你在實際項目中坐標花了我大半天時間去計算。(真的是半天D衅臁)
So....方案二騰空出世舶斧!

方案二:猥瑣遮掩法

猥瑣遮蓋法實現(xiàn)圖3的原理如下:

猥瑣遮蓋法原理圖

看上去極易操作,代碼極易簡潔察皇,符合我一貫的代碼美學風格茴厉,完美,所以接下來.....我們繼續(xù)算坐標什荣!(狗頭)

image.png

核心代碼

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];
    NSRect originalRect = NSMakeRect(0, 0, 300, 180);
    NSRect coverRect = NSMakeRect(0, 150, 300, 30);
    
    NSColor *red = [NSColor redColor];
    [red setFill];
    
    //圓角矩形
    NSBezierPath *originalPath = [NSBezierPath bezierPathWithRoundedRect:originalRect xRadius:30 yRadius:30];
    [originalPath fill];
    
    //遮掩矩形
    NSBezierPath *coverPath = [NSBezierPath bezierPathWithRect:coverRect];
    [coverPath fill];
}

效果圖

猥瑣遮掩法實現(xiàn)圖2效果圖

結(jié)語

那么圖1中矾缓,兩個選擇框究竟有什么區(qū)別呢,如圖所示:

不同

搞了這么多花里胡哨稻爬,終于滿足了美工姐姐的奇葩需求嗜闻,完美!
(需要項目代碼的同學桅锄,請私聊我琉雳。)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末样眠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翠肘,更是在濱河造成了極大的恐慌檐束,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件束倍,死亡現(xiàn)場離奇詭異被丧,居然都是意外死亡,警方通過查閱死者的電腦和手機绪妹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評論 3 399
  • 文/潘曉璐 我一進店門甥桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邮旷,你說我怎么就攤上這事黄选。” “怎么了廊移?”我有些...
    開封第一講書人閱讀 169,631評論 0 364
  • 文/不壞的土叔 我叫張陵糕簿,是天一觀的道長。 經(jīng)常有香客問我狡孔,道長懂诗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評論 1 300
  • 正文 為了忘掉前任苗膝,我火速辦了婚禮殃恒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘辱揭。我一直安慰自己离唐,他們只是感情好,可當我...
    茶點故事閱讀 69,196評論 6 398
  • 文/花漫 我一把揭開白布问窃。 她就那樣靜靜地躺著亥鬓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪域庇。 梳的紋絲不亂的頭發(fā)上嵌戈,一...
    開封第一講書人閱讀 52,793評論 1 314
  • 那天,我揣著相機與錄音听皿,去河邊找鬼熟呛。 笑死,一個胖子當著我的面吹牛尉姨,可吹牛的內(nèi)容都是我干的洪己。 我是一名探鬼主播促绵,決...
    沈念sama閱讀 41,221評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼问顷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了椎瘟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評論 0 277
  • 序言:老撾萬榮一對情侶失蹤昔逗,失蹤者是張志新(化名)和其女友劉穎降传,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體勾怒,經(jīng)...
    沈念sama閱讀 46,699評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,770評論 3 343
  • 正文 我和宋清朗相戀三年声旺,在試婚紗的時候發(fā)現(xiàn)自己被綠了笔链。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,918評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡腮猖,死狀恐怖鉴扫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情澈缺,我是刑警寧澤坪创,帶...
    沈念sama閱讀 36,573評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站姐赡,受9級特大地震影響莱预,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜项滑,卻給世界環(huán)境...
    茶點故事閱讀 42,255評論 3 336
  • 文/蒙蒙 一依沮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枪狂,春花似錦危喉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至严蓖,卻和暖如春薄嫡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈飒。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評論 1 274
  • 我被黑心中介騙來泰國打工岂座, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杭措。 一個月前我還...
    沈念sama閱讀 49,364評論 3 379
  • 正文 我出身青樓费什,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子鸳址,可洞房花燭夜當晚...
    茶點故事閱讀 45,926評論 2 361