Анимация содержимого CoreGraphics / drawRect для UIView - PullRequest
3 голосов
/ 25 января 2012

Можно ли анимировать содержимое CoreGraphics UIView?

Допустим, у меня есть подкласс UIView с именем MyView, который реализует метод drawRect: следующим образом:

- (void) drawRect: (CGRect) rect {
    CGContextRef c = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(c, someColor);
    CGContextSetLineWidth(c, someWidth);
    CGContextMoveToPoint(c, leftOfMyUIView, topOfMyUIView);
    CGContextAddLineToPoint(c, leftOfMyUIView, bottomOfMyUIView);
    CGContextStrokePath(c);
}

Другими словами - он рисует вертикальную линию в левой части моего подкласса UIView. Есть ли простой способ анимировать этот UIView, чтобы линия перемещалась с левой стороны на правую сторону вида? Я бы хотел, чтобы он «дрейфовал» слева направо.

Для ясности - по причинам, в которые я не буду вдаваться, я не могу переместить / оживить экземпляр MyView. Лучшее решение, которое я могу использовать, это добавить новый подкласс UIView. Что-то вроде LineView extends UIView, а затем сделайте LineView точными размерами линии, которую я хочу нарисовать, заполните ее, используя собственный метод drawRect, а затем добавьте экземпляр LineView в MyView в качестве подпредставления. Это позволило бы мне анимировать положение объекта LineView, используя блок анимации, но кажется слишком сложным для достижения чего-то настолько простого.

1 Ответ

0 голосов
/ 23 января 2016

Исходя из вашего комментария о том, что будут сотни экземпляров LineView, лучше использовать подклассы CALayer, а не подклассы UIView. Объекты UIView предоставляют вам обработку событий, и на iOS каждый UIView имеет CALayer для обработки его рендеринга. Если вы не хотите / не нуждаетесь в отслеживании событий для отдельных строк, то все эти экземпляры UIView, вероятно, будут излишними накладными расходами. Вы можете получить доступ к слою родительского UIView и добавить свои подслои линии по мере необходимости.

Если я правильно понимаю вашу проблему, CoreGraphics не нужен. Вы можете установить backgroundColor слоев линии для обработки заливки. Или, если линии не будут прямыми, вы можете использовать CAShapeLayer для рендеринга путей линий.

...