設計稿中常常要求實現(xiàn)圓角效果,這樣才能體現(xiàn)mac ui的特色。NSView默認是尖角的,要想實現(xiàn)圓角效果,最直觀的做法是,在xib文件的基礎上,加一層layer,再設置layer的cornerRadius屬性,代碼如下:
self.view.wantsLayer = YES;
self.view.layer.cornerRadius = VIEW_RADIUS;
然而實踐證明,上述使用xib的方式,并不能很好地達到預期。原有的尖角還是若隱若現(xiàn),特別是在某些背景view的襯托下,就更加明顯了。
行之有效的方法是,不用xib,自己實現(xiàn)view,并重寫view的drawRect方法,利用Core Graphics(縮寫CG)把圓角畫出來,代碼如下:
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
CGContextRef context = [NSGraphicsContext currentContext].CGContext; // Core Graphics上下文,其實就是張畫布
CGFloat minx = CGRectGetMinX(dirtyRect), midx = CGRectGetMidX(dirtyRect), maxx = CGRectGetMaxX(dirtyRect);
CGFloat miny = CGRectGetMinY(dirtyRect), midy = CGRectGetMidY(dirtyRect), maxy = CGRectGetMaxY(dirtyRect);
CGContextMoveToPoint(context, minx, midy); // 設置繪制起點為(minx, midy)
CGContextAddArcToPoint(context, minx, miny, midx, miny, VIEW_RADIUS); // 繪制view左下圓角
CGContextAddArcToPoint(context, maxx, miny, maxx, midy, VIEW_RADIUS); // 繪制view右下圓角 CGContextAddArcToPoint(context, maxx, maxy, midx, maxy, VIEW_RADIUS); // 繪制view右上圓角
CGContextAddArcToPoint(context, minx, maxy, minx, midy, VIEW_RADIUS); // 繪制view左上圓角
CGContextClosePath(context); CGContextSetFillColorWithColor(context, backGroundColor); //填充view的背景顏色
CGContextFillPath(context);}
繪制代碼有些難以理解,具體參考如下鏈接:
http://stackoverflow.com/questions/8709794/when-drawing-an-arc-using-cgcontextaddarctopoint-what-does-x1-y1-and-x2-y2