Независимая бегущая строка текста в независимом потоке
ОБНОВЛЕНО
Я хочу сделать бегущую текстовую строку, какой путь лучше сделать?
-(void)viewDidLoad
{
CGSize mySize = CGSizeZero;
mySize = [kGrindFMRunningText sizeWithFont:[UIFont fontWithName:@"Verdana" size:16] constrainedToSize:CGSizeMake(4000, 30) lineBreakMode:UILineBreakModeWordWrap];
runningText = [[UIScrollView alloc] initWithFrame:CGRectMake(60, -5, 260, 50)];
grind_fm_text = [[UILabel alloc] initWithFrame:CGRectMake(0, 15, mySize.width, 30)];
[grind_fm_text setUserInteractionEnabled:NO];
[grind_fm_text setBackgroundColor:[UIColor clearColor]];
[grind_fm_text setTextColor:[UIColor whiteColor]];
[grind_fm_text setFont:[UIFont fontWithName:@"Verdana" size:16]];
[grind_fm_text setText:kGrindFMRunningText];
[runningText addSubview:grind_fm_text];
[grind_fm_text release];
[self animate];
}
- (void)animate
{
[UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentState animations:^{
grind_fm_text.frame = CGRectMake(-grind_fm_text.frame.size.width, 15, grind_fm_text.frame.size.width, grind_fm_text.frame.size.height);
// Do your animation in one direction until text is gone
} completion:^(BOOL finished){
grind_fm_text.frame = CGRectMake(260, 15, grind_fm_text.frame.size.width, grind_fm_text.frame.size.height);
// Move scroll position back to original position
[self animate]; // Then call animate again to repeat
}];
}
-(void)songChange
{
CGSize mySize = CGSizeZero;
mySize = [result sizeWithFont:[UIFont fontWithName:@"Verdana" size:16] constrainedToSize:CGSizeMake(4000, 30) lineBreakMode:UILineBreakModeWordWrap];
grind_fm_text.frame = CGRectMake(grind_fm_text.frame.origin.x, 15, mySize.width, 30);
grind_fm_text.text = result;;
[self animate];
}
- (void)startStopStream {
[streamer stop];
//[bufferIndicator stopAnimating];
[CATransaction begin];
[self.view.layer removeAllAnimations];
[CATransaction commit];
grind_fm_text.text = kGrindFMRunningText;
CGSize mySize = CGSizeZero;
mySize = [kGrindFMRunningText sizeWithFont:[UIFont fontWithName:@"Verdana" size:16] constrainedToSize:CGSizeMake(4000, 30) lineBreakMode:UILineBreakModeWordWrap];
grind_fm_text.frame = CGRectMake(grind_fm_text.frame.origin.x, 15, mySize.width, 30);
[self animate];
}
[CATransaction begin]; [myView.layer removeAllAnimations]; [CATransaction commit];
не работает для меня UIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentState
работает странно: во-первых, он не выполняет блок завершения, как я вижу, или, может быть, он работает, но анимация не начинается снова. И если я нажимаю кнопку, то ничего не происходит, но когда я нажимаю ее второй раз, анимация начинается с другого направления и замедляется до остановки.
1 ответ
Вы должны быть в состоянии сделать это проще с вложенными анимационными блоками UIView. В блоке анимации прокрутите его в одном направлении, в блоке завершения прокрутите в другом направлении, а в блоке завершения анимации снова вызовите вашу анимационную функцию, чтобы она повторялась.
Что-то вроде этого:
- (void)animate
{
[UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{
// Do your animation in one direction
} completion:^(BOOL finished){
[UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{
// Do your animation in the other direction
} completion:^(BOOL finished){
[self animate];
}];
}];
}
Или, если вы хотите, чтобы он прокручивался полностью, сделайте это снова, что-то вроде:
- (void)animate
{
[UIView animateWithDuration:10.0 delay:0. options:UIViewAnimationOptionCurveLinear animations:^{
// Do your animation in one direction until text is gone
} completion:^(BOOL finished){
// Move scroll position back to original position
[self animate]; // Then call animate again to repeat
}];
}
По умолчанию, анимация использует UIViewAnimationOptionCurveEaseInOut
вариант анимации. Вы хотите UIViewAnimationOptionCurveLinear
вариант. Я обновил свой код выше, чтобы включить это.
Согласно ответу на этот вопрос: отменить анимацию UIView? Вы должны иметь возможность отменить анимацию, позвонив [myView.layer removeAllAnimations];
где myView - анимированный вид прокрутки. Не забудьте импортировать <QuartzCore/QuartzCore.h>
вверху для доступа к методам CALayer.
Изменить: вам может потребоваться вызвать его так, чтобы убедиться, что он запускается сразу, а не после следующей итерации цикла выполнения:
[CATransaction begin];
[myView.layer removeAllAnimations];
[CATransaction commit];
Или, если это все еще не работает, то, вероятно, просто изменив параметры параметров в вызовах метода UIView для UIViewAnimationOptionCurveLinear|UIViewAnimationOptionBeginFromCurrentState
должно работать, без необходимости вызывать removeAllAnimations. На самом деле, попробуйте сначала.