Генерация кода плоха
, я ненавижу языки, которые требуют, чтобы Вы использовали генерацию кода (или copy& вставка) для простых вещей, как JavaBeans со всеми их Методами считывания и Методами set.
AutoProperties C# являются шагом в правильном направлении, но для хорошего DTOs с Полями, Свойствами и параметрами Конструктора Вам все еще нужно большое дублирование.
После нескольких попыток я теперь уверен, что градиенты не влияют на штрихи, поэтому я считаю, что рисовать невозможно градиентные линии с помощью 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);
, и все работает нормально. Спасибо Брэду Ларсону за решающий намек.
Вы можете использовать слои базовой анимации. Вы можете использовать CAShaperLayer для своей линии, установив его свойство path, а затем вы можете использовать CAGradientLayer в качестве маски слоя для вашего слоя-фигуры, что приведет к исчезновению линии.
Замените ваши вызовы CGContext ... вызовами CGPath ..., чтобы создать путь к строке. Задайте поле пути на слое, используя этот путь. Затем в вашем градиентном слое укажите цвета, которые вы хотите использовать (возможно, от черного к белому), а затем установите маску как линейный слой следующим образом:
[gradientLayer setMask:lineLayer];
Что круто в слое градиента, так это то, что он позволяет вам указать список мест, где градиент прекратится, так что вы можете плавно появляться и исчезать. Он поддерживает только линейные градиенты, но похоже, что это может соответствовать вашим потребностям.
Дайте мне знать, если вам нужны разъяснения.
EDIT: Теперь, когда я думаю об этом, просто создайте один CAGradientLayer, который представляет собой ширину / высоту желаемой линии. Укажите цвета градиента (от черного к белому или от черного к прозрачному цвету), а также начальную и конечную точки, и это должно дать вам то, что вам нужно.
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.