основная анимация, как выборочно масштабировать CAShapeLayer - PullRequest
0 голосов
/ 14 мая 2019

Предположим, у меня есть карта (буквально дорожная карта), отображаемая внутри моего вида.Дороги представлены CAShapeLayer с путем, установленным в cgPath NSBezierPath (который, в свою очередь, имеет путь, заданный для набора CGPoints в формате широты / долготы).

layerTracker["roadLayer"] = CAShapeLayer()
layerTracker["roadLayer"]!.bounds = CGRect(x: 0, y: 0, width: 600, height: 400)
self.layer?.addSublayer(layerTracker["roadLayer"]!)
// add CAShapeLayer for roads as needed

Я хочу, чтобы пользователь мог увеличивать и уменьшать масштаб, поэтому я использую CATransform3DMakeScale, когда пользователь прокручивает мышь или трекпад.

layerTracker["roadLayer"]!.transform = CATransform3DMakeScale(1 / toValue, 1 / toValue, 1)

Это прекрасно работает, однако яесть дополнительная сложность, с которой я не уверен, как справиться.Я хочу, чтобы некоторые узлы (например, метки и значки названий дорог) были освобождены от масштабирования, чтобы при увеличении / уменьшении пользователя метка названия дороги оставалась того же размера, а форма дороги пропорционально масштабировалась.

Неуверен, как справиться с этим?Могу ли я иметь иерархию слоев, чтобы один слой масштабировался, а другой не масштабировался?Нужно ли вручную рассчитывать смещение каждой метки названия дороги и располагать их один за другим в масштабированном слое?Любая помощь приветствуется!

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

...