2010-07-24 4 views
0

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

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

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

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

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

+0

Благодарим за внимание. У меня было такое чувство. Я делаю это на iPhone, поэтому фильтры недоступны. Я попробую использовать рамку. Хорошее предложение об использовании потоков! – anna

0

Метод: Использование 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/

 Смежные вопросы

  • Нет связанных вопросов^_^