我已经阅读了有关nstimers,runloops和主要线程的stackoverflow上的一百万篇帖子,但它们似乎没有我想要的相同问题或答案。 我的情况:
总而言之,我正在尝试在UIViews上同时绘制时动画一些滚动视图。这是否可能没有它们以这样的方式冲突动画不流畅?如果我使用activityIndicatorView它绝对可能,旋转轮永远不会卡顿,它总是旋转顺畅。我试过使用runloops,但我无法弄明白。 这是我目前的一些代码:
-(void)startLoading
{
[self performSelectorInBackground:@selector(showSpinningCells)];
[self drawOnViews];
}
-(void)drawOnViews
{
//HERE A LOT OF VIEWS ARE BEING UPDATED AND CALLED SETNEEDSDISPLAY
}
-(void)spinCells
{
//HERE I USE PERFORMSELECTORONMAINTHREAD TO SET THE
//CONTENTOFFSET OF THE SCROLLVIEWS
}
-(void)showSpinningCells
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
spinLoop = [NSRunLoop currentRunLoop];
spinTimer = nil;
self.userInteractionEnabled = FALSE;
spinTimer = [[NSTimer scheduledTimerWithTimeInterval:0.2
target:self
selector:@selector(spinCells)
userInfo:nil
repeats:YES] retain];
[spinLoop run];
[pool release];
}
在我再尝试之前,请告诉我这是否可行,如果是的话,怎么样?目前我从未见过任何旋转。如果我事后没有做任何事情,我确实看到旋转,但是当我在UIViews上调用图纸时,旋转完全停止。
答案 0 :(得分:0)
你可以试试这个,
-(void)showSpinningCells
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
spinTimer = nil;
self.userInteractionEnabled = FALSE;
spinTimer = [[NSTimer timerWithTimeInterval:0.2
target:self
selector:@selector(spinCells)
userInfo:nil
repeats:YES] retain];
[[NSRunLoop currentRunLoop] addTimer:spinTimer forMode:NSRunLoopCommonModes];
[pool release];
}
为timer
currentRunLoop
到NSRunLoopCommonModes
答案 1 :(得分:0)
UI动画只能在drawOnViews方法退出后才能进行,因此UI运行循环可以获得在主线程中进行动画所需的时间。一种解决方案是将drawOnViews方法切割成非常短的异步段,每个段都快速退出,以便UI动画可以在每个段之间继续。