CGContext中的椭圆径向渐变?

时间:2016-12-06 02:30:28

标签: ios swift cgcontext

据我所知,您可以使用两种方法在library(dplyr) library(tidyr) separate(df, fact, into = c("position1", "position2")) %>% #splits the column into two gather() %>% #converts to long format group_by(key, value) %>% #grouped by both the columns count() %>% #get the count spread(key, n, fill=0) #spread to wide format # A tibble: 3 × 3 # value position1 position2 #* <chr> <dbl> <dbl> #1 a 1 0 #2 b 0 2 #3 c 1 0 中绘制渐变,即CGContextdrawLinearGradient。我正在寻找的是一种定义椭圆渐变的方法,我可以在其中定义drawRadialGradientx半径。

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

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)

中绘制椭圆渐变

3 个答案:

答案 0 :(得分:1)

您应该能够缩放上下文并使用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的{​​{1}}属性设置为CAGradientLayer的未记录的私有值,则我认为这是大致的行为。它使用startPoint作为中心,并使用startPoint和endPoint的差来确定radiusX和radiusY值(即endPoint定义渐变的边界框的一个角,而startPoint是中心)。当您使起点和终点几乎相同时,它的行为确实很奇怪,所以那里可能发生的事情比我想像的还要多(这也许就是为什么苹果公司从不理会将其公开)的原因。

答案 1 :(得分:0)

我唯一能想到的是在绘制渐变之前将不等x和y比例因子的比例变换应用于上下文。这会使它变得圆滑,并且应该使它变成椭圆形。

答案 2 :(得分:0)

没有“皇家之路”。此工具不是内置的,因此您必须自己绘制每个像素。 (可能有第三方库会为您做这件事。)