ios - текст прокрутки - пользовательская анимация - PullRequest
4 голосов
/ 26 октября 2011

Я часами искал в интернете, и не смог найти хорошее решение.

Я пытаюсь прокрутить текст на моем UIView слева направо и наоборот.Я не хочу использовать CoreAnimations, так как мне нужно контролировать анимацию.

Движение следует синусоидальной кривой, от 0 до pi или 0-> 1-> 0.

Что такоелучший способ реализовать эту пользовательскую анимацию?

Что я придумал после некоторого исследования, это рекурсивный алгоритм, который вызывает его сам и проходит через цикл до завершения.

- (void) scrollText:(id)sender timeConstant:(float) _timeconstant timeOffset:(NSDate*) _timeoffset direction:(int)_direction
{

float p = [[NSDate date] timeIntervalSinceDate:_timeoffset] / _timeconstant * _direction;   
float ps =  sinf( p * M_PI);


CGSize txtsize = [msg_text sizeWithFont:font];

float offset = txtsize.width / 2;
float screenwidth = self.view.frame.size.width;
float screenheight= self.view.frame.size.height;


int virtualwidth = txtsize.width;
[ivText setFrame:CGRectMake(screenwidth/2 - offset + (virtualwidth / 2 * ps), 100, txtsize.width, txtsize.height)];

//redraw
[[self view] setNeedsDisplay];
//keep going
if (ps * _direction > 0) [self scrollText:self timeConstant:_timeconstant timeOffset:_timeoffset direction:_direction];


}

Проблема в том, что представление не обновляется :( и я не уверен, что это лучший подход для анимации такого типа.

1 Ответ

1 голос
/ 29 апреля 2012

Я думаю, что ваше представление не обновляется, потому что вы никогда не выходите из рекурсии, и поэтому цикл выполнения никогда не заканчивает итерацию. Лучшим решением, чем рекурсивный метод, может быть использование NSTimer, которое запускает вашу функцию один раз каждые, скажем, 1/30 или 1/60 секунды, используя +[NSTimer timerWithTimeInterval:target:selector:userInfo:repeats:].

Если вы хотите сохранить рекурсивную структуру, имеющуюся здесь, вы можете использовать -[NSObject performSelector:withObject:afterDelay:] для вызова вашей функции после задержки. Просто используйте что-то вроде 1 / 60.0 для задержки и упакуйте любую необходимую информацию в словарь или массив для передачи в параметр withObject:.

Любой из этих методов регистрирует ваш метод в цикле выполнения, который будет вызван позднее. Это позволяет циклу выполнения начать новую итерацию, что означает, что обновления пользовательского интерфейса могут происходить.

Редактировать: если ваша строка не меняется во время этой анимации, рассчитайте размер текста один раз и сохраните его в переменной экземпляра. Расчет размера строки во время каждого вызова вашего метода может быть дорогостоящим.

...