- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
NSBezierPath* bezier = [NSBezierPath bezierPath];
//bezier = [self makeRectPath:bezier withRect:NSMakeRect(50, 50, 200, 400) corner:20];
//bezier = [self makeBubble:bezier withBubbleRect:NSMakeRect(300, 50, 200, 40) corner:15];
bezier = [self makeBubble:bezier withBubbleRect:NSMakeRect(10, 0, self.bounds.size.width-10, self.bounds.size.height-10) corner:8 atPostion:1];
[[NSColor greenColor]set];
[bezier fill];
[[NSColor redColor]set];
[bezier stroke];
}
/*
支持微调气泡
atPostion:是指小尖角位置,左上 = 1,左下 = 2,右上 = 3,右下 = 4
*/
- (NSBezierPath *)makeBubble:(NSBezierPath *) bezierPath
withBubbleRect:(NSRect)rect
corner:(CGFloat)corner
atPostion:(NSInteger)pos
{
//基本偏角40度,正好是引出小三解的位置
CGFloat baseAngle = 40;
CGFloat cornetOffWidth = 10;
// CGFloat cornetOffHeight = 5;
//注angle只设定三个值0, 10,40
/*
0: 说明现在小三角相对于矩开来说,已看不出来了,这里直接用直角
10:说明此时的小三解效果效好
40:说明此时的矩开和小三角太小,需要调到40度有有效果。
这三个值会自动的根据外部 corner 参数进行调整
*/
CGFloat angle = 10;
BOOL midCorner = NO;
//矩形的宽和高
CGFloat rw = CGRectGetWidth(rect);
CGFloat rh = CGRectGetHeight(rect);
//最小长度
CGFloat minDiameter = rw > rh ? rh : rw;
CGFloat radius = 0;//半径
if (corner > 0)
{
radius = corner > minDiameter / 2 ? minDiameter / 2 : corner;
}
//最小长度与圆角比
CGFloat rate = radius / minDiameter;
//在下角坐标,
NSPoint leftBottom = NSMakePoint(CGRectGetMinX(rect), CGRectGetMinY(rect));
NSPoint leftBottomX = NSMakePoint(leftBottom.x + radius, leftBottom.y);
NSPoint leftBottomY = NSMakePoint(leftBottom.x, leftBottom.y + radius);
NSPoint rightBottom = NSMakePoint(CGRectGetMaxX(rect), CGRectGetMinY(rect));
NSPoint rightBottomX = NSMakePoint(rightBottom.x - radius, rightBottom.y);
NSPoint rightBottomY = NSMakePoint(rightBottom.x, rightBottom.y + radius);
NSPoint rightTop = NSMakePoint(CGRectGetMaxX(rect), CGRectGetMaxY(rect));
NSPoint rightTopX = NSMakePoint(rightTop.x - radius, rightTop.y);
NSPoint rightTopY = NSMakePoint(rightTop.x, rightTop.y - radius);
NSPoint leftTop = NSMakePoint(CGRectGetMinX(rect), CGRectGetMaxY(rect));
NSPoint leftTopX = NSMakePoint(leftTop.x + radius, leftTop.y);
NSPoint leftTopY = NSMakePoint(leftTop.x, leftTop.y - radius);
//最小高度在30以下的,只需要在左或右画三解即可
if (minDiameter < 30 )
{
if (rate > 0.33 && rate <= 0.5)
{
angle = 40;
}
else //在中间画直角
{
angle = 0;
midCorner = YES;
}
}
else if (minDiameter >= 30 && minDiameter <= 50)
{
if (rate > 0.2 && rate < 0.4)
{
angle = 40;
}
else if (rate >= 0.4 && rate <= 0.5)
{
angle = 10; //直角
}
else
{
angle = 0;
}
}
else // 50 以上的
{
if
Mac OS 贝塞尔曲线画气泡
最新推荐文章于 2022-07-17 00:00:23 发布

最低0.47元/天 解锁文章
6033

被折叠的 条评论
为什么被折叠?



