Анимация UILabel с помощью CoreAnimation / QuartzCore в приложении для iOS - PullRequest
7 голосов
/ 21 сентября 2011

Я на самом деле застрял в проблеме с анимацией UILabel в моем iOS-приложении.После 2 дней поиска в Интернете фрагментов кода, по-прежнему ничего не получается.

Каждый пример, который я нашел, был о том, как анимировать UIImage, добавив его как подпредставление в UIView по слою.Есть ли хороший пример анимации UILabel?Я нашел хорошее решение для мигающей анимации, установив свойство alpha, например:

Моя функция:

- (void)blinkAnimation:(NSString *)animationID finished:(BOOL)finished target:(UIView *)target
{
    NSString *selectedSpeed = [[NSUserDefaults standardUserDefaults] stringForKey:@"EffectSpeed"];
    float speedFloat = (1.00 - [selectedSpeed floatValue]);

    [UIView beginAnimations:animationID context:target];
    [UIView setAnimationDuration:speedFloat];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(blinkAnimation:finished:target:)];

    if([target alpha] == 1.0f)
        [target setAlpha:0.0f];
    else
        [target setAlpha:1.0f];
    [UIView commitAnimations];
}

Вызов моей функции на UILabel:

[self blinkAnimation:@"blinkAnimation" finished:YES target:labelView];

А как насчет Pulse или масштабируемой анимации?

1 Ответ

13 голосов
/ 28 сентября 2011

К сожалению, размер шрифта не является анимируемым свойством NSView.Чтобы масштабировать UILabel, вам необходимо использовать более продвинутые Core Animation методы, используя CAKeyframeAnimation :

  1. Импортируйте QuartzCore.framework в свойпроекта и #import <QuartzCore/QuartzCore.h> в вашем коде.
  2. Создайте новый CAKeyframeAnimation объект, в который вы можете добавить свои ключевые кадры.
  3. Создайте CATransform3D значение, определяющее операцию масштабирования (не путайте с трехмерной деталью - вы используете этот объект для любых преобразований на слое).
  4. Сделайте преобразование одним из ключевых кадровв анимации, добавив его к объекту CAKeyframeAnimation , используя его метод setValues.
  5. Установите продолжительность анимации, вызвав ее метод setDuration
  6. Наконец,добавьте анимацию к слою метки, используя [[yourLabelObject layer] addAnimation:yourCAKeyframeAnimationObject forKey:@"anyArbitraryString"]

Окончательный код может выглядеть примерно так:

// Create the keyframe animation object
CAKeyframeAnimation *scaleAnimation = 
   [CAKeyframeAnimation animationWithKeyPath:@"transform"];

// Set the animation's delegate to self so that we can add callbacks if we want
scaleAnimation.delegate = self;

// Create the transform; we'll scale x and y by 1.5, leaving z alone 
// since this is a 2D animation.
CATransform3D transform = CATransform3DMakeScale(1.5, 1.5, 1); // Scale in x and y

// Add the keyframes.  Note we have to start and end with CATransformIdentity, 
// so that the label starts from and returns to its non-transformed state.
[scaleAnimation setValues:[NSArray arrayWithObjects:
                  [NSValue valueWithCATransform3D:CATransform3DIdentity],
                  [NSValue valueWithCATransform3D:transform],
                  [NSValue valueWithCATransform3D:CATransform3DIdentity],
                  nil]];

// set the duration of the animation
[scaleAnimation setDuration: .5];

// animate your label layer = rock and roll!
[[self.label layer] addAnimation:scaleAnimation forKey:@"scaleText"];

Я оставлю повторяющуюся "импульсную" анимацию какупражнение для вас: подсказка, это вовлекаетЕсли метод animationDidStop!

Еще одно замечание - полный список анимируемых свойств CALayer (одним из которых является "transform") можно найти здесь .С Днем Рождения!

...