我想为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方向†的动画.
(†)剪切是实现预期效果的重要步骤.
Swift 2及更早版本,请参阅Steve Baughman的评论:
self.layer.addAnimation(animation, forKey: kCATransitionPush)
►在GitHub上找到此解决方案以及有关Swift Recipes的其他详细信息.
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.在行动中
一次性:没有接口扩展:
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)