Mac OS X下實現矩形部分圓角
問題
在進行今天的內容之前,首先我想問一個問題:下圖中,藍色選擇框與紅色選擇框除顏色、大小外有何不同?(我會在後文揭曉答案)

圖1
目標
本文今天要討論的是:在Mac OS X下,如何實現矩形的部分圓角。
比如這樣:

圖2
或者這樣:

圖3
解決方案
要想實現上圖樣式,有兩種解決方案。
方案1:蠢萌描點法
蠢萌描點法實現圖2的原理圖如下:

蠢萌描點法原理圖
如上圖所示,首先確定整個矩形的的幾個特殊點,然後通過CGContextAddLineToPoint來實現繪製。
核心程式碼
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
CGMutablePathRef path = CGPathCreateMutable();
CGContextRef cr = [[NSGraphicsContext currentContext] graphicsPort];
CGContextAddPath(cr, path);
//為了照顧視力不好的童鞋,我將圖2的座標擴大了10倍。
//順時針將座標填充入引數即可
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);
}
效果

蠢萌描點法效果
根據寫程式碼來看,蠢萌描點法手法過於粗糙,我不會告訴你在實際專案中座標花了我大半天時間去計算。(真的是半天!)
So....方案二騰空出世!
方案二:猥瑣遮掩法
猥瑣遮蓋法實現圖3的原理如下:

猥瑣遮蓋法原理圖
看上去極易操作,程式碼極易簡潔,符合我一貫的程式碼美學風格,完美,所以接下來.....我們繼續算座標!(狗頭)

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];
}
效果圖

猥瑣遮掩法實現圖2效果圖
結語
那麼圖1中,兩個選擇框究竟有什麼區別呢,如圖所示:

不同
搞了這麼多花裡胡哨,終於滿足了美工姐姐的奇葩需求,完美!
(需要專案程式碼的同學,請私聊我。)
相關文章
- visio圓角矩形怎麼改變圓角大小
- canvas 繪製圓角矩形Canvas
- SVG 繪製圓角矩形SVG
- css圓角矩形邊框CSS
- Android 圓角、圓形 ImageView 實現AndroidView
- canvas-座標系、圓角矩形、紋理、剪裁Canvas
- 微信小程式 canvas圓角矩形的繪製微信小程式Canvas
- iOS開發_繪製圓角矩形虛線環iOS
- UIView 的部分圓角的設定UIView
- 原來 Canvas 也能直接繪製圓角矩形了Canvas
- iOS 實現檢視指定圓角iOS
- Mac OS X 下檔名亂碼出現的原因和解決方法Mac
- Glide實現圓角圖片,以及圓形圖片IDE
- Flutter 彩邊圓角 Container 的實現FlutterAI
- qt如何將下拉框的框設定為圓角矩形QT
- 如何用pscc 2018圓角外掛mac版製作倒圓角Mac
- 如何實現css漸變圓角邊框CSS
- WPF之小米Logo超圓角的實現Go
- 在相親原始碼開發中,如何實現圓角及特殊圓角的使用?原始碼
- CSS不用背景圖片實現優惠券樣式反圓角,凹圓角,反向半圓角,並且背景漸變CSS
- Mac OS X 清除DNS快取MacDNS快取
- 圓形視訊和圓角視訊的一種實現方式
- Android 實現一個通用的圓角佈局Android
- canvas 繪製矩形缺角Canvas
- CSS矩形對角斜線CSS
- Hammerspoon for Mac - OS X桌面自動化神器Mac
- 0x04_My-OS實現自定義顏色
- 神奇的濾鏡!巧妙實現內凹的平滑圓角
- CSS 奇思妙想 | 巧妙的實現帶圓角的三角形CSS
- php實現矩形覆蓋PHP
- Mac OS X 下 Python 多版本管理器 pyenv 的安裝及使用MacPython
- Mac OS X 顯示和隱藏檔案Mac
- Mac OS 下更換 Ruby 源Mac
- 透過灰盒Fuzzing技術來發現Mac OS X安全漏洞Mac
- Flutter 圓形/圓角頭像Flutter
- Android自定義View之圖片外形特效——輕鬆實現圓角和圓形圖片AndroidView特效
- AUTOCAD——圓角命令
- Mac(OS X)中Git安裝與GitHub基本使用MacGithub