我有一个标签,我想要一个“车速表”效果;当为标签的文本分配一个新值时,我希望旧值向上滚动,新值从下面进入。我不知道如何实现这一目标。这就是我目前使用的;
CATransition *animation = [CATransition animation];
animation.duration = .2f;
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
animation.removedOnCompletion = YES;
[mylabel.layer addAnimation:animation
forKey:@"changeTextTransition"];
mylabel.text = @"new text";
除了顶部和底部的过渡在淡入淡出之前超出标签的边界之外,这种效果非常好。我希望过渡效果包含在标签的范围内。
我试图为图层创建一个蒙版,并将图层蒙版设为边界,但这没有效果:
UIImageView *maskView = [[UIImageView alloc] initWithImage:labelMask];
// this image is a png that is the same dimensions as the label, and is 100% opaque and colored white
maskView.frame = mylabel.frame;
mylabel.layer.mask = maskView.layer;
mylabel.layer.masksToBounds = YES;
我甚至尝试过另一种面具创建方法:
CALayer *maskLayer = [CALayer new];
maskLayer.frame = mylabel.frame;
maskLayer.contents = (id)(labelMask.CGImage); // same image as above
maskLayer.contentsRect = mylabel.bounds;
mylabel.layer.mask = maskLayer;
mylabel.layer.masksToBounds = YES;
这没有效果。
我还可以尝试阻止图层动画泄漏到UILabel的边界?
答案 0 :(得分:3)
您正在使用动画移动UILabel
的图层,而UILabel
的{{1}}(UIView)/ clipsToBounds
(CALayer)正在限制{{ 1}}层本身就是一个整体。
为了更清楚:如果你将放在里面masksToBounds
,或者尝试在标签的图层上渲染更大的东西,它将被掩码剪掉。但是,如果您只是将标签移动到父视图上的其他位置 - 那么它将保持整体,因为蒙版随之移动......
即使动画制作,这也是完全相同的情况。掩模与图层一起移动。
因此,解决方案包含另一个UILabel
中的UILabel
,其本身具有UILabel
集。
这还允许您创建UIView
的子类,它是一个迷你控制器,管理自己的标签,根据需要使用clipsToBounds
子类上的简单接口为它们设置动画。 (我想这就是你正在做的事情,你忘了在容器视图上设置UIView
...)