Я взял ответ nacho4d и реализовал код, поэтому я подумал, что другим людям, пришедшим на этот вопрос, будет полезно посмотреть рабочий код:
Я добавил переменные-члены в свой класс:
CGPoint startOffset;
CGPoint destinationOffset;
NSDate *startTime;
NSTimer *timer;
и свойства:
@property (nonatomic, retain) NSDate *startTime;
@property (nonatomic, retain) NSTimer *timer;
и обратный вызов таймера:
- (void) animateScroll:(NSTimer *)timerParam
{
const NSTimeInterval duration = 0.2;
NSTimeInterval timeRunning = -[startTime timeIntervalSinceNow];
if (timeRunning >= duration)
{
[self setContentOffset:destinationOffset animated:NO];
[timer invalidate];
timer = nil;
return;
}
CGPoint offset = [self contentOffset];
offset.x = startOffset.x +
(destinationOffset.x - startOffset.x) * timeRunning / duration;
[self setContentOffset:offset animated:NO];
}
затем:
- (void) doAnimatedScrollTo:(CGPoint)offset
{
self.startTime = [NSDate date];
startOffset = self.contentOffset;
destinationOffset = offset;
if (!timer)
{
self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01
target:self
selector:@selector(animateScroll:)
userInfo:nil
repeats:YES];
}
}
вам также потребуется очистка таймерав методе dealloc.Поскольку таймер сохранит ссылку на цель (self), а self имеет ссылку на таймер, некоторый код очистки для отмены / уничтожения таймера в viewWillDisappear, вероятно, также будет хорошей идеей.
Любые комментариина вышеупомянутом или предложения по улучшению были бы весьма желательны, но это работает очень хорошо со мной, и решает другие проблемы, которые у меня были с setContentOffset: animated:.