我正在构建一个 IOS 应用程序。
我正在尝试做以下核心动画
文本 1 出现在中心 然后由文本 2 替换,方法是让文本 2 从左到右移动以替换文本 1 然后让文本 3 从左到右移动以替换文本 2 然后让文本 4 从左到右移动以替换文本3.
每个文本基本上都跳进去替换文本1、2、3。所以每个文本都冲进去替换前面的文本。我怎样才能做到这一点?
我正在构建一个 IOS 应用程序。
我正在尝试做以下核心动画
文本 1 出现在中心 然后由文本 2 替换,方法是让文本 2 从左到右移动以替换文本 1 然后让文本 3 从左到右移动以替换文本 2 然后让文本 4 从左到右移动以替换文本3.
每个文本基本上都跳进去替换文本1、2、3。所以每个文本都冲进去替换前面的文本。我怎样才能做到这一点?
您没有提及您使用的是 UILabels 还是 CATextLayers。这是使用 CATextLayers 的一种方法:
首先创建要设置动画的图层并将其添加到图层树中。我在 viewDidLoad 中做到了:
- (void)viewDidLoad
{
[super viewDidLoad];
_strings = @[@"Hello world", @"Goodbye cruel world", @"Hello again", @"And again, goodbye!"];
_textLayer = [CATextLayer layer];
[_textLayer setString:[_strings objectAtIndex:0]];
[_textLayer setBounds:CGRectMake(0.0f, 0.0f, 400.0f, 50.0f)];
[_textLayer setPosition:[[self view] center]];
[_textLayer setForegroundColor:[[UIColor orangeColor] CGColor]];
[_textLayer setAlignmentMode:kCAAlignmentCenter];
[[[self view] layer] addSublayer:_textLayer];
}
然后,将一个按钮连接到此插座。对于文本层的“字符串”属性的每次更改,您都会看到从左到右的推送动画。
- (IBAction)didTapChangeText:(id)sender
{
NSInteger index = arc4random() % [_strings count];
CATransition *transition = [CATransition animation];
[transition setType:kCATransitionPush];
[transition setSubtype:kCATransitionFromLeft];
// Tell Core Animation which property you want to use the
// transition animation for. In this case 'string'
[_textLayer addAnimation:transition forKey:@"string"];
// Trigger the animation by setting the string property
[_textLayer setString:[_strings objectAtIndex:index]];
}
根据您的描述,这应该可以为您提供所需的内容。
您好,您可以使用 UIView 的 animateWithDuration:delay:options:animations:completion 方法来执行这些动画。只需将它们嵌套在完成块中即可将它们链接在一起。我认为它们仅适用于 iOS 3.2 及更高版本。
UILabel *labelText2; // Can be set up in Interface Builder, linked as IBOutlet
CGRect rectLabel2 = labelText2.frame;
rectLabel2.center = labelText2.superview.center;
[UIView animateWithDuration:1.0f delay:0.0f options:nil animations:^(){
labelText2.frame = rectLabel2; // Animates labelText2 to the center of its container view
} completion:^(BOOL finished) {
// Continue with other animation using another UIView animateWithDuration block...
UILabel *labelText3; // Setup in Interface Builder on the left outside of the container view
CGrect rectLabel3 = labelText3.frame;
rectLabel3.center = labelText3.superview.center;
[UIView animateWithDuration:1.0f delay:0.0f options:nil animations:^(){
labelText3.frame = rectLabel3;
} completion:^(BOOL finishedInside) {
// Nest in Label4, Label5 etc...
}];
}];