您的位置:首页 > 移动开发 > IOS开发

iOS 文字动画,文字逐个显示

2016-01-16 21:51 435 查看
随手记:

对于iOS文字动画,首先想到的应该是基于CoreText框架将文字每个都写出来,加上定时器给定每个字显示的时间,这是一种思维方式:

#import "ViewController.h"
#import <CoreText/CoreText.h>
@interface ViewController ()
{
NSMutableArray *labels;
NSMutableArray *numArr;
NSMutableArray *dataArr;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

}

- (IBAction)buttonClick:(id)sender {
UIView *vi = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
vi.backgroundColor = [UIColor whiteColor];
[self.view addSubview:vi];

CATextLayer *textLayer = [CATextLayer layer];
textLayer.frame = vi.bounds;
textLayer.contentsScale = [UIScreen mainScreen].scale;
[vi.layer addSublayer:textLayer];
textLayer.alignmentMode = kCAAlignmentJustified;
textLayer.wrapped = YES;

UIFont *font = [UIFont fontWithName:@"EuphemiaUCAS-Bold" size:12];
NSArray *familyNames = [UIFont familyNames];
for( NSString *familyName in familyNames ){

printf( "Family: %s \n", [familyName UTF8String] );

NSArray *fontNames = [UIFont fontNamesForFamilyName:familyName];
for( NSString *fontName in fontNames ){

printf( "\tFont: %s \n", [fontName UTF8String] );
}
}

NSString *str = @"还是月西江更有意境:日暮江水远,入夜随风迁,秋叶乱水月...";

NSMutableAttributedString *string = nil;
string = [[NSMutableAttributedString alloc] initWithString:str];
CFStringRef fontName = (__bridge CFStringRef)(font.fontName);
CGFloat fontSize = font.pointSize;
CTFontRef fontRef = CTFontCreateWithName(fontName, fontSize, NULL);
NSDictionary *attribs = @{
(__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor whiteColor].CGColor,
(__bridge id)kCTFontAttributeName:(__bridge id)fontRef
};
[string setAttributes:attribs range:NSMakeRange(0, str.length)];

dataArr = [NSMutableArray arrayWithObjects:(__bridge id _Nonnull)(fontRef),attribs,string,str,textLayer, nil];
numArr = [NSMutableArray array];
for (int i = 0; i < str.length; i++) {
[numArr addObject:[NSNumber numberWithInt:i]];
[self performSelector:@selector(changeToBlack) withObject:nil afterDelay:0.1 * i];
}
CFRelease(fontRef);

}

- (void)changeToBlack {
CTFontRef fontRef = (__bridge CTFontRef)(dataArr[0]);
NSMutableAttributedString *string = dataArr[2];
NSNumber *num = [numArr firstObject];
int y = [num intValue];
NSDictionary *attribs = dataArr[1];
attribs = @{
(__bridge id)kCTForegroundColorAttributeName:(__bridge id)[UIColor blackColor].CGColor,
(__bridge id)kCTFontAttributeName:(__bridge id)fontRef
};
[string setAttributes:attribs range:NSMakeRange(y, 1)];
if (numArr.count > 1) {
[numArr removeObjectAtIndex:0];
}
CATextLayer *textLayer = [dataArr lastObject];
textLayer.string = string;
}


是不是还有另一种思维方式呢,答案是有的,只需在label上加一个白色的挡板就OK了,当然,别忘记了把挡板的anchorPoint变为(1,0.5),让它从左边开始变小:

#import "ViewController.h"

@interface ViewController ()
{
UIView *myView;
BOOL isclick;
}
@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 50)];
label.text = @"我其实很喜欢你的,初音";
[self.view addSubview:label];

myView = [[UIView alloc] initWithFrame:CGRectMake(200, 100, 200, 50)];
myView.backgroundColor = [UIColor whiteColor];
myView.layer.anchorPoint = CGPointMake(1, 0.5);
[self.view addSubview:myView];
}
- (IBAction)buttonClick:(id)sender {
if (!isclick) {
[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
myView.bounds = CGRectMake(0, 0, 10, 50);
} completion:^(BOOL finished) {
}];
} else {
[UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
myView.bounds = CGRectMake(0, 0, 200, 50);
} completion:^(BOOL finished) {
}];
}
isclick = !isclick;
}


demo下载地址:http://download.csdn.net/download/et295394330/9406943
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: