UILabel的动画文本更改

Joe*_*een 21 ios swift

我想为UILabel中的文本更改添加动画效果.

例如:旧文本向上移动,新文本从底部移动.

我已经意识到我需要标签.一个用于旧的,一个用于新文本.第二个UILabel位于第一个下面.然后两个都动起来了.

但是,你如何切断第一个标签,因为它通过框架的顶部动画?

Swi*_*ect 105

使用UIView扩展名

使用单个标签动画到位:
- 利用内置CALayer动画和UIView扩展
- 在故事板中,将UILabel内部放置一个UIView带有剪辑子视图标志.
- pushTransition适用于大多数人UIView

1.扩展

// Usage: insert view.pushTransition right before changing content
extension UIView {
    func pushTransition(_ duration:CFTimeInterval) {
        let animation:CATransition = CATransition()
        animation.timingFunction = CAMediaTimingFunction(name:
            kCAMediaTimingFunctionEaseInEaseOut)
        animation.type = kCATransitionPush
        animation.subtype = kCATransitionFromTop
        animation.duration = duration
        layer.add(animation, forKey: kCATransitionPush)
    }
}
Run Code Online (Sandbox Code Playgroud)

2.调用

if let aLabel = label {
    aLabel.pushTransition(0.4) // Invoke before changing content
    aLabel.text = "\(count)"
    count += 1
}
Run Code Online (Sandbox Code Playgroud)

3.例子

具有kCAMediaTimingFunctionEaseInEaseOut曲线,0.4第二持续时间和kCATransitionFromTop方向†的动画.

CALayer动画


(†)剪切是实现预期效果的重要步骤.

Swift 2及更早版本,请参阅Steve Baughman的评论:
self.layer.addAnimation(animation, forKey: kCATransitionPush)

►在GitHub上找到此解决方案以及有关Swift Recipes的其他详细信息.

  • 在Swift 3中对我来说很好.只需改变一行:`self.layer.add(animation,forKey:kCATransitionPush)` (4认同)

Swi*_*ect 6

Objective-C的

斯威夫特的UIView扩展可以在Objective-C与来解决Interface Extension.

1. Interface Extension

@interface UIView (SO33632266)
- (void)pushTransition:(CFTimeInterval)duration;
@end

@implementation UIView (SO33632266)
// Usage: insert [view pushTransition:]; right before changing content
- (void)pushTransition:(CFTimeInterval)duration
{
    CATransition *animation = [CATransition new];
    animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    animation.type = kCATransitionPush;
    animation.subtype = kCATransitionFromTop;
    animation.duration = duration;
    [self.layer addAnimation:animation forKey:kCATransitionPush];
}
@end
Run Code Online (Sandbox Code Playgroud)

2. pushTransition调用

[aLabel pushTransition:0.4];
aLabel.text = [[NSString alloc] initWithFormat:@"%ld", (long) ++self.count];
Run Code Online (Sandbox Code Playgroud)

3.在行动中

UILabel动画


一次性:没有接口扩展:

CATransition *animation = [CATransition animation];
animation.timingFunction = [CAMediaTimingFunction
    functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromTop;
animation.duration = 0.4;
[aLabel.layer addAnimation:animation forKey:@"kCATransitionPush"];
Run Code Online (Sandbox Code Playgroud)

调用:

aLabel.text = [[NSString alloc] initWithFormat:@"%ld", (long) ++self.count];
Run Code Online (Sandbox Code Playgroud)