动画转换UILabel的一部分

时间:2014-12-18 07:37:42

标签: ios objective-c uilabel transform nsattributedstring

假设我有这样的文字:"今天下午3点见到我",我想动画放大"今天"部分从原始大小到x1.2然后返回(只是一种视觉效果,吸引用户注意文本的那一部分)。

我如何实现这一目标?简单的解决方案是使用3个分离的标签并为中间标签设置CGAffineTransformMakeScale动画,但这是一个可怕的解决方案,因为当文本发生变化时(例如,当我们将其本地化时)很难做到这一点其他语言)。

1 个答案:

答案 0 :(得分:1)

我的建议是使用NSAttributedString并使用CADisplayLink刷新标签。像这样:

CADisplayLink *timer = [CADisplayLink displayLinkWithTarget:self selector:@selector(animatePartOfText)];
    [timer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

-(void)animatePartOfText
{
    //calculate the size
    CGFloat size = 0 ;//......
    self.textLable.attributedText = [self makeTextWithPartSize:size];
}

-(NSAttributedString*)makeTextWithPartSize:(CGFloat)size
{
    NSAttributedString *firstPart = [[NSAttributedString alloc] initWithString:@"Meet me " attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]}];
    NSAttributedString *animatedPart = [[NSAttributedString alloc] initWithString:@"today" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size]}];
    NSAttributedString *lastPart = [[NSAttributedString alloc] initWithString:@" at 3 p.m" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]}];
    NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithAttributedString:firstPart];
    [text appendAttributedString:animatedPart];
    [text appendAttributedString:lastPart];
    return text;
}

我不确定性能,但它应该有效。