小编Bay*_*Bay的帖子

CGGradient:在角度上绘制线性渐变

我正在尝试在一个角度上绘制线性CGGradient。因为不存在“ CGContextDrawLinearGradientWithAngle()”,所以我尝试使用CGContextDrawLinearGradient(CGContextRef,CGGradientRef,CGPoint起点,CGPoint终点,CGGradientDrawingOptions)。

考虑到这一点,我需要将角度(度)转换为起点和终点。我想模仿NSGradient的drawInBezierPath:angle。(不幸的是,作为AppKit的一部分,NSGradient不适用于iOS开发人员。)幸运的是,该文档告诉我们如何获得起始渐变

- (CGPoint)startingPointForAngle:(CGFloat)angle rect:(CGRect)rect { 
    CGPoint point = CGPointZero;
    if (angle < 90.0f)
        point = CGPointMake(CGRectGetMinX(rect), CGRectGetMaxY(rect));
    else if (angle < 180.0f)
        point = CGPointMake(CGRectGetMaxX(rect), CGRectGetMaxY(rect));
    else if (angle < 270.0f)
        point = CGPointMake(CGRectGetMaxX(rect), CGRectGetMinY(rect));
    else
        point = CGPointMake(CGRectGetMinX(rect), CGRectGetMinY(rect));

    return point;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,文档没有告诉我们如何获得终点。(使用矩形的高度或宽度,因为该距离仅适用于某些角度。)那里的几个位置告诉我们如何找到终点。不幸的是,在计算终点之前需要知道距离。然而,需要计算终点以获得距离。显然还有更多,因为NSGradient似乎已经弄清楚了。

- (CGPoint)endingPointForAngle:(CGFloat)angle rect:(CGRect)rect startingPoint:(CGPoint)startingPoint {
    //http://www.zahniser.net/~russell/computer/index.php?title=Angle%20and%20Coordinates
    //(x + distance * cos(a), y + distance * sin(a))
    CGFloat angleInRadians = (CGFloat)M_PI/180.0f * angle;
    CGFloat distance = ????????;
    CGPoint point = CGPointMake(startingPoint.x …
Run Code Online (Sandbox Code Playgroud)

iphone core-graphics objective-c ios

5
推荐指数
1
解决办法
2230
查看次数

标签 统计

core-graphics ×1

ios ×1

iphone ×1

objective-c ×1