我使用UIPickerView
来显示随机数。用户可以按下按钮,从而触发随机选择UIPickerView
内的数字。
当我调用方法时,UIPickerView
内显示的对象或数字有多少并无关紧要:
[self.picker selectRow:randomRow inComponent:0 animated:YES];
它始终以相同的时间间隔进行动画制作。
是否有任何选项或方法可以延长上述方法的动画时间间隔?
我尝试将它放在动画块中:
[UIView beginAnimations:@"identifier" context:nil];
// code
[UIView commitAnimations];
但这似乎是一个死胡同。
我也尝试在完成块中执行它:
// 0.34f is the approximate defualt apple animation
[UIView animateWithDuration:0.34f animations:^{
[self.picker selectRow:randomRow inComponent:0 animated:YES];
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.34f animations:^{
[self.picker selectRow:randomRow inComponent:0 animated:YES];
} completion:nil];
}];
任何帮助都将不胜感激。
答案 0 :(得分:5)
我做了一个项目并玩了一段时间,直到找到这个棘手的解决方案。它基于方法performSelector:afterDelay
以下是按钮的内部代码:
- (void)click:(id)sender
{
int randomRow = <>;//Your random method
int currentRow = [_picker selectedRowInComponent:0];
int i = 0;
while(1)
{
i++;
NSString *rowToSelectString = [NSString stringWithFormat:@"%d", currentRow];
NSDictionary *rowToSelectDictionary = @{@"row":rowToSelectString};
if(randomRow < currentRow)
{
// Go backward
currentRow--;
}
else
{
// Go forward
currentRow++;
}
[self performSelector:@selector(selectRowInPicker:) withObject:rowToSelectDictionary afterDelay:i*0.1];//Change the delay as you want
if(currentRow == randomRow)
{
break;
}
}
}
诀窍:
-(void)selectRowInPicker:(NSDictionary *)rowToSelectDictionary
{
NSInteger row = [[rowToSelectDictionary objectForKey:@"row"] integerValue];
[_picker selectRow:row inComponent:0 animated:YES];
}
这对我来说很好。告诉我你是否遇到问题。
答案 1 :(得分:5)
最后,我已经实现了所选答案的“更薄”版本:
- (IBAction)spinTheWheelButtonPressed:(UIButton *)sender
{
for (int i = 0; i < 30; i++) {
NSUInteger randomRow = arc4random_uniform((int)[self.dataSource count]);
[self performSelector:@selector(selectRowInPicker:) withObject:@(randomRow) afterDelay:i*0.1];
}
}
- (void)selectRowInPicker:(NSNumber *)randomRow
{
[self.picker selectRow:[randomRow integerValue] inComponent:0 animated:YES];
}
答案 2 :(得分:1)
我有类似的问题,但不幸的是,据我所知,没有简单的方法可以延迟动画。 所以我四处走动并在pickerView上放置了一个UIView。我将该视图子类化为将其所有触摸传递给pickerView,当选择了某些内容时,我只是在视图中绘制了一个不透明度的图层,其中该行通常会停留并在动画块中将其设置为动画,因为选择始终是正确的在pickerView的中间。