所以我有两个问题,但两者都是相关的。
NSTimer单击按钮时移动进度视图。在点击按钮的前几次,这个动画工作得很好,但是之后它开始加速这个过程,实际上是从NSTimer循环的初始开始跳到NSTimer循环的末尾。我想知道是否有人听说过这个问题并且/或知道一个解决方案?,
UItableViewCell中,当按下编辑按钮时,NSTimer循环被激活。编辑按钮激活具有此[self.tableView2 setEditing:NO animated:YES];和NSTimer scheduledTimerWithInterval的函数.(进度视图动画)。这里的问题是,它的setEdit动画不再是动画,它只是弹出到位。再一次,有人知道这个问题的解决方案吗?下面是问题2的代码(这两个问题的代码都非常相似,所以如果您可以在这里发现问题,那么很可能我可以使用该解决方案来解决这两个问题):
-(void)editTable{
[self.tableView2 setEditing:YES animated:YES];
iCount = 8;
iCount2 = 257;
forwardProgress = YES;
animationFlag = YES;
myTimer = [NSTimer scheduledTimerWithTimeInterval:0.001f target:self selector:@selector(increaseAmount) userInfo:nil repeats:YES];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(cancelEdit)];
}
-(void)cancelEdit{
[self.tableView2 setEditing:NO animated:YES];
forwardProgress = NO;
animationFlag = YES;
iCount = 38;
iCount2 = 227;
myTimer = [NSTimer scheduledTimerWithTimeInterval:0.001f target:self selector:@selector(increaseAmount) userInfo:nil repeats:YES];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editTable)];
}
-(void)increaseAmount{
float max = 38.0f;
float max2 = 257.0f;
float min2 = 227.0f;
float min = 8.0f;
if (animationFlag == YES) {
if (forwardProgress == YES) {
if (iCount <= max) {
iCount++;
// NSLog(@"iCount = %i", iCount);
}
if (iCount2 >= min2) {
iCount2--;
// NSLog(@"iCount2 = %i", iCount2);
}
if (iCount <= max) {
[tableView2 reloadData];
}
if (iCount2 >= min2) {
[tableView2 reloadData];
}
if (iCount == max) {
animationFlag = NO;
}
newFrame = CGRectMake(iCount, 33.0f, iCount2, 11.0f);
[tableView2 reloadData];
}else{
if (iCount >= min) {
iCount--;
NSLog(@"iCount = %i", iCount);
}
if (iCount2 <= max2) {
iCount2++;
NSLog(@"iCount2 = %i", iCount2);
}
newFrame = CGRectMake(iCount, 33.0f, iCount2, 11.0f);
if (iCount >= min) {
[tableView2 reloadData];
}
if (iCount2 <= max2) {
[tableView2 reloadData];
}
if (iCount == min) {
animationFlag = NO;
}
}
}
}发布于 2011-07-17 18:36:21
任何计时器完成后都会使自己失效,除非它有重复:是的。如果是这样的话,您需要自己在某个时候使其失效,最好是在满足所有条件的情况下。在您的情况下,我认为当您设置animationFlag == 0时,您会想要它(我想这就是您希望计时器停止触发的时候)。使用这样的东西:
if ([myTimer isValid]) {
[myTimer invalidate];
myTimer = nil;您还需要在开始时将代码放在editTable中。这样,如果一个计时器正在运行,并且有人再次启动它,它将首先重置,然后开始again.Otherwise,您有多个定时器都会触发increaseAmount。当用户取消计时器时,您也需要它。
发布于 2012-05-18 20:08:49
reloadData调用。表视图不能同时重新加载和动画。发布于 2011-07-17 07:37:26
我相信rgeorge是正确的;
当你停止你的动画时,你不会摆脱"myTimer“。因此,即使您可能不再看到动画,increaseAmount仍然是一遍又一遍地被调用。将方法更改为如下所示:
-(void)increaseAmount:(NSTimer*)Timer;然后,当您完成增加的数量,确保关闭定时器从内部的increaseAmount。
https://stackoverflow.com/questions/6722026
复制相似问题