gpt4 book ai didi

ios - CGContext 中的椭圆径向渐变?

转载 作者:行者123 更新时间:2023-11-28 16:01:33 35 4
gpt4 key购买 nike

据我所知,您可以使用两种方法在 CGContext 中绘制渐变,即 drawLinearGradientdrawRadialGradient。我正在寻找一种定义椭圆渐变的方法,我可以在其中定义 xy 半径。

此功能在另一个环境中的示例 (SVG)。

<RadialGradient id="gradient" cx="50" cy="50" rx="20" ry="40" fx="150" fy="75">

drawRadialGradient 的现有声明如下。

func drawRadialGradient(_ gradient: CGGradient, 
startCenter: CGPoint,
startRadius: CGFloat,
endCenter: CGPoint,
endRadius: CGFloat,
options: CGGradientDrawingOptions)

起点和终点半径都是标量值,所以您只能画圆。如何在 CGContext 中绘制椭圆渐变?

最佳答案

您应该能够缩放上下文并使用 CGContextDrawRadialGradient()。如果按比例缩小,则不应有伪影。以下是否有效?

CGContextRef context;
CGGradientRef gradient;
CGGradientDrawingOptions options;
CGPoint center;
CGFloat radiusX;
CGFloat radiusY;

CGFloat radius = MAX(radiusX, radiusY);
CGContextSaveGState(context);
// scale down by the smaller dimension, and translate so the center stays in place
if (radiusX < radiusY) {
CGContextTranslateCTM(context, center.x - (center.x * (radiusX / radiusY)), 0);
CGContextScaleCTM(context, radiusX / radiusY, 1.0);
}
else {
CGContextTranslateCTM(context, 0, center.y - (center.y * (radiusY / radiusX)));
CGContextScaleCTM(context, 1.0, radiusY / radiusX);
}
CGContextDrawRadialGradient(context, gradient, center, 0, center, radius, options);
CGContextRestoreGState(context);

顺便说一句,我认为如果你设置 type 大致就是这样的行为。 CAGradientLayer的属性(property)到 @"radial" 的无证和私有(private)值(value).它以startPoint为圆心,以startPoint和endPoint之差来确定radiusX和radiusY的值(即endPoint定义了渐变边界框的一个角,startPoint为圆心)。当您使起点和终点几乎相同时,它确实会出现奇怪的行为,所以那里发生的事情可能比我想象的要多(这可能也是为什么 Apple 从不费心公开它的原因)。

关于ios - CGContext 中的椭圆径向渐变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40986859/

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