gpt4 book ai didi

iphone - CG渐变: Drawing a linear gradient on an angle

转载 作者:可可西里 更新时间:2023-11-01 04:54:32 25 4
gpt4 key购买 nike

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

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

- (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;
}

不幸的是,文档没有告诉我们如何得到终点。 (使用矩形的高度或宽度作为距离仅对某些角度足够。)Several sites out there告诉我们如何找到终点。不幸的是,在计算终点之前需要知道距离。然而,需要计算终点以获得距离。显然还有更多,因为 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 + distance * cosf(angleInRadians), startingPoint.y + distance * sinf(angleInRadians));
return point;
}

CGPoint startingGradientPoint = [self startingPointForAngle:self.fillGradientAngle rect:rect];
CGPoint endingGradientPoint = [self endingPointForAngle:self.fillGradientAngle rect:rect startingPoint:startingGradientPoint];
CGContextDrawLinearGradient(graphicsContext, self.fillGradient, startingGradientPoint, endingGradientPoint, 0);

任何想法。

最佳答案

我正在处理同样的问题,方法有点不同,我使用中心点和角度,并向左和向右延伸边以找到边缘上的点,我的问题是会有空白如果天使没有指向任何轴,并且绘图选项函数提供了“kCGGradientDrawsBeforeStartLocation 或 kCGGradientDrawsAfterEndLocation”,所以看起来一侧是空的。

但事实证明我可以将这两个选项与'|'结合起来,所以问题解决了,这是我的代码:

CGGradientRef grRef = CGGradientCreateWithColors(colorSpace,  (__bridge CFArrayRef)gradient.colorArray, NULL);
CGFloat degree = angle * M_PI / 180;
CGPoint center = CGPointMake(width/2, height/2);
CGPoint startPoint = CGPointMake(center.x - cos (degree) * width/2, center.y - sin(degree) * height/2);
CGPoint endPoint = CGPointMake(center.x + cos (degree) * width/2, center.y + sin(degree) * height/2);

NSLog(@"start point:%@ \n, end point: %@",NSStringFromCGPoint(startPoint),NSStringFromCGPoint(endPoint));

CGContextDrawLinearGradient(gradientContext, grRef, startPoint, endPoint, kCGGradientDrawsBeforeStartLocation|kCGGradientDrawsAfterEndLocation);

关于iphone - CG渐变: Drawing a linear gradient on an angle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404103/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com