在 iOS 应用程序中使用 CoreAnimation / QuartzCore 动画 UILabel

Posted

技术标签:

【中文标题】在 iOS 应用程序中使用 CoreAnimation / QuartzCore 动画 UILabel【英文标题】:Animating UILabel with CoreAnimation / QuartzCore in iOS App 【发布时间】:2011-09-21 15:05:35 【问题描述】:

实际上,在我的 ios 应用程序中为 UILabel 设置动画时遇到了问题。 在网上搜索了 2 天的代码 sn-ps 后,仍然没有结果。

我找到的每个示例都是关于如何为 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];

但是脉冲或缩放动画怎么样?

【问题讨论】:

【参考方案1】:

不幸的是,字体大小不是 NSView 的动画属性。为了扩展 UILabel,您需要使用更高级的 Core Animation 技术,使用 CAKeyframeAnimation:

    将 QuartzCore.framework 导入您的项目,并将 #import <QuartzCore/QuartzCore.h> 导入您的代码中。 创建一个新的CAKeyframeAnimation 对象,您可以将关键帧添加到该对象。 创建一个定义缩放操作的CATransform3D 值(不要被 3D 部分弄糊涂了——您可以使用此对象对图层进行任何变换)。 通过使用 setValues 方法将变换添加到 CAKeyframeAnimation 对象,使变换成为动画中的关键帧之一。 通过调用动画的setDuration 方法设置动画的持续时间 最后,使用[[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 动画属性的完整列表(其中“转换”是其中之一)可以在 here 找到。补间快乐!

【讨论】:

非常感谢您的详细回答。我已经使用带有计时器的 CABasicAnimation 解决了这个问题。我相信您的代码也可以正常工作,因此您可以接受。 ;)

以上是关于在 iOS 应用程序中使用 CoreAnimation / QuartzCore 动画 UILabel的主要内容,如果未能解决你的问题,请参考以下文章

应用程序在 iOS 9 中崩溃,但在 iOS 10 中没有

iOS - 如何使用 branch.io 在 Appstore 中测试深度链接

在 ios 应用中使用 googleapis

在 tvOS 应用中使用 iOS 框架

在 ios 应用中使用 Monaca 版本

在 iOS 应用中使用 Stripe 支付接受捐款