用于 for 循环内动画的 Objective-C 完成块(暂停循环处理)
Posted
技术标签:
【中文标题】用于 for 循环内动画的 Objective-C 完成块(暂停循环处理)【英文标题】:Objective-C completion block for animation within for loop (pause loop processing) 【发布时间】:2016-01-24 16:59:45 【问题描述】:我有一个方法可以淡入,然后淡出一个按钮标签(如下图):
-(void)fade:(NSString *)text
NSLog(@"Starting Fade In for symbol %@",text);
[self.symbolButton setAlpha:0.0f];
[self.symbolButton setTitle:text forState:UIControlStateNormal];
[UIView animateWithDuration:2 animations:^
[self.symbolButton setAlpha:1.0f];
completion:^(BOOL finished)
NSLog(@"Starting Fade Out for symbol %@",text);
[UIView animateWithDuration:2 animations:^
[self.symbolButton setAlpha:0.0f];
completion:nil];
];
这按预期工作。但是,我想循环遍历数组的内容,而不是单个字符串(例如,淡入“A”,淡出“A”,淡入“B”,淡出“B”.. ...)。
在上面的代码中,完成块在开始淡出之前等待淡入完成(好)。但是,如果我尝试使用 for 循环处理数组(修改方法以接受数组并在迭代数组的 for 循环中嵌套操作),循环会立即循环,而不是等待第一个字符完成。
有没有办法在第二个动画动作中使用完成块来暂停循环处理 - 还是我以错误的方式处理这个?
【问题讨论】:
递归可能是一种解决方案,但在现代编程范式中,使用递归是不好的。在完成中调用相同的函数。 【参考方案1】:你可以试试这个。我没有测试它,但这个想法应该可行
NSArray<UIButton*>* arrButtons;
NSString* text;
for (int i = 0 ; i < arrButtons.count; i++)
UIButton* b = arrButtons[i];
b.alpha = 0.0f;
[b setTitle:text forState:UIControlStateNormal];
[UIView animateKeyframesWithDuration:2 delay:4*i options:0 animations:^
b.alpha = 1.0f;
completion:^(BOOL finished)
NSLog(@"Starting Fade Out for symbol %@",text);
[UIView animateWithDuration:2 animations:^
b.alpha = 0.0f;
completion:nil];
];
【讨论】:
以上是关于用于 for 循环内动画的 Objective-C 完成块(暂停循环处理)的主要内容,如果未能解决你的问题,请参考以下文章