UILabel:多行文本动画逐行淡出

时间:2017-11-01 01:30:36

标签: ios animation uilabel

例如:

label.text = @"I \n love \n stackoverflow ";

如何像第一次动画淡出秀一样展示这三条线"我" ,然后在动画期间动画淡出节目"爱"最后在时间动画淡出节目动画之后" stackoverflow"?

1 个答案:

答案 0 :(得分:0)

我为您的请求创建了一个功能。确保您的标签具有动态高度numberOfLines = 0并尝试它;)

- (void)animateLabel:(UILabel*)label withString:(NSString*)string duration:(NSTimeInterval)duration {
  NSUInteger length = [string length];
  NSUInteger paraStart = 0, paraEnd = 0, contentsEnd = 0;
  NSMutableArray *displayedStringArray = [NSMutableArray array];
  NSRange currentRange;

  while (paraEnd < length) {
    [string getParagraphStart:&paraStart end:&paraEnd
              contentsEnd:&contentsEnd forRange:NSMakeRange(paraEnd, 0)];
    currentRange = NSMakeRange(0, contentsEnd);
    [displayedStringArray addObject:[string substringWithRange:currentRange]];
  }


  CATransition *animation = [CATransition animation];
  animation.duration = duration;
  animation.type = kCATransitionFade;
  animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

  __block void (^animationBlock) (int lineNumber);
  __block void (^weakAnimationBlock) (int lineNumber);
  animationBlock = ^void(int lineNumber){
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(duration * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      [label.layer addAnimation:animation forKey:@"changeTextTransition"];
      label.text = displayedStringArray[lineNumber];

      weakAnimationBlock = animationBlock;
      __block int nextLine = lineNumber + 1;

      if (nextLine < displayedStringArray.count) {
        weakAnimationBlock(nextLine);
      }
    });
  };

  animationBlock(0);
}

只需致电

[YOUR_CLASS animateLabel:label withString:@"I\nLove\nStackOverFlow" duration:YOUR_DURATION];]