Как провести линию градиента (исчезающий в/) с Базовой Графикой/iPhone?

Генерация кода плоха

, я ненавижу языки, которые требуют, чтобы Вы использовали генерацию кода (или copy& вставка) для простых вещей, как JavaBeans со всеми их Методами считывания и Методами set.

AutoProperties C# являются шагом в правильном направлении, но для хорошего DTOs с Полями, Свойствами и параметрами Конструктора Вам все еще нужно большое дублирование.

24
задан Benjohn 1 February 2017 в 08:57
поделиться

3 ответа

После нескольких попыток я теперь уверен, что градиенты не влияют на штрихи, поэтому я считаю, что рисовать невозможно градиентные линии с помощью CGContextStrokePath () . Для горизонтальных и вертикальных линий решение состоит в том, чтобы вместо этого использовать CGContextAddRect () , что, к счастью, мне и нужно. Я заменил

CGContextMoveToPoint(context, x, y);
CGContextAddLineToPoint(context, x2, y2);
CGContextStrokePath(context);

на

CGContextSaveGState(context);
CGContextAddRect(context, CGRectMake(x, y, width, height));
CGContextClip(context);
CGContextDrawLinearGradient (context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

, и все работает нормально. Спасибо Брэду Ларсону за решающий намек.

Я заменил

CGContextMoveToPoint(context, x, y);
CGContextAddLineToPoint(context, x2, y2);
CGContextStrokePath(context);

на

CGContextSaveGState(context);
CGContextAddRect(context, CGRectMake(x, y, width, height));
CGContextClip(context);
CGContextDrawLinearGradient (context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

, и все работает нормально. Спасибо Брэду Ларсону за решающий намек.

Я заменил

CGContextMoveToPoint(context, x, y);
CGContextAddLineToPoint(context, x2, y2);
CGContextStrokePath(context);

на

CGContextSaveGState(context);
CGContextAddRect(context, CGRectMake(x, y, width, height));
CGContextClip(context);
CGContextDrawLinearGradient (context, gradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);

, и все работает нормально. Спасибо Брэду Ларсону за решающий намек.

20
ответ дан 28 November 2019 в 22:38
поделиться

Вы можете использовать слои базовой анимации. Вы можете использовать CAShaperLayer для своей линии, установив его свойство path, а затем вы можете использовать CAGradientLayer в качестве маски слоя для вашего слоя-фигуры, что приведет к исчезновению линии.

Замените ваши вызовы CGContext ... вызовами CGPath ..., чтобы создать путь к строке. Задайте поле пути на слое, используя этот путь. Затем в вашем градиентном слое укажите цвета, которые вы хотите использовать (возможно, от черного к белому), а затем установите маску как линейный слой следующим образом:

 [gradientLayer setMask:lineLayer];

Что круто в слое градиента, так это то, что он позволяет вам указать список мест, где градиент прекратится, так что вы можете плавно появляться и исчезать. Он поддерживает только линейные градиенты, но похоже, что это может соответствовать вашим потребностям.

Дайте мне знать, если вам нужны разъяснения.

EDIT: Теперь, когда я думаю об этом, просто создайте один CAGradientLayer, который представляет собой ширину / высоту желаемой линии. Укажите цвета градиента (от черного к белому или от черного к прозрачному цвету), а также начальную и конечную точки, и это должно дать вам то, что вам нужно.

8
ответ дан 28 November 2019 в 22:38
поделиться

After you draw the line, you can call

CGContextClip(context);

to clip further drawing to your line area. If you draw the gradient, it should now be contained within the line area. Note that you will need to use a clear color for your line if you just want the gradient to show, and not the line underneath it.

There is the possibility that a line will be too thin for your gradient to show up, in which case you can use CGContextAddRect() to define a thicker area.

I present a more elaborate example of using this context clipping in my answer here.

8
ответ дан 28 November 2019 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: