Сглаживание при анимировании свойства «transform» на CALayer? - PullRequest
0 голосов
/ 24 июля 2010

У меня есть CALayer с нарисованным кругом в его окончательном размере.Я хочу анимировать круг так, чтобы он начинался с масштаба 1% и заканчивался на 100%.Сейчас анимация не очень плавная, потому что края мерцают во время масштабирования.В конечном размере круг выглядит правильно.Мне интересно, есть ли способ иметь сглаживание во время самой анимации.

CATransform3D fromTransform = CATransform3DMakeScale(0.01, 0.01, 1.0);
CATransform3D toTransform = CATransform3DMakeScale(1.0, 1.0, 1.0);

CABasicAnimation *theAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
theAnimation.duration = 1.5;
theAnimation.fromValue = [NSValue valueWithCATransform3D:fromTransform];
theAnimation.toValue = [NSValue valueWithCATransform3D:toTransform]; 

[myLayer addAnimation:theAnimation forKey:@"animateScale"];

Ответы [ 2 ]

2 голосов
/ 24 июля 2010

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

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

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

0 голосов
/ 20 августа 2014

Метод: использование layer.shouldRasterize

  1. Создайте superlayer / superview, который на 1 пиксель больше во всех 4 направлениях
  2. Выполнить преобразование на superlayer / superview
  3. Включить layer.shouldRasterize для оригинала layer / view

Метод: Рисование к UIImage

  • Нарисуйте свой контент в UIImage
  • Убедитесь, что у вас есть прозрачная рамка размером 1 пиксель вокруг содержимого
  • Показать изображение

Ссылка: http://darknoon.com/2012/05/18/the-transparent-border-trick/

...