#ios #objective-c #core-animation #cabasicanimation
#iOS #objective-c #ядро-анимация #cabasicanimation
Вопрос:
Предполагая, что я анимирую центральную оранжевую надпись «HELLO» слева направо, используя приведенный ниже код
Вопрос: Как можно анимировать следующий тикер, чтобы он выглядел так, будто вид «ПРИВЕТ» движется бесконечно без пробелов или скачков. (представьте это как биржевой тикер …)
-(void)animate:(UIView *)thisView
{
CABasicAnimation *moveView;
moveView = [CABasicAnimation animationWithKeyPath:@"position.x"];
moveView.byValue = @(self.view.frame.size.width);
moveView.duration = 3.0;
moveView.removedOnCompletion = YES;
moveView.fillMode = kCAFillModeRemoved;
moveView.autoreverses = NO;
moveView.repeatCount = 10;
[[thisView layer] addAnimation:moveView forKey:@"x"];
}
Комментарии:
1. Вы хотите, чтобы это говорило
lloHelloHelloHel
или …llo He
? т.е. когда вы говорите «без пробелов», что вы имеете в виду? Вы хотите, чтобы одна надпись «Hello» заполняла ширину, но не имела пробелов для следующей надписи «Hello»? Или метка «Hello» должна соответствовать только ширине ее содержимого?2. Кроме того, я думаю, что ваше направление анимации должно быть другим. Если это будет сделано так, как указывает стрелка, это будет означать чтение надписей в обратном направлении.
3. Привет, @Fogmeister, вид «Привет» — это ширина представления содержимого, я обновил изображение выше, чтобы сделать его более четким. Представление HELLO — это единственное представление размером self.view.width, метка внутри него предназначена только для иллюстрации проблемы.
4. Хорошо, просто добавляю ответ.
Ответ №1:
Хорошо, для этого вам понадобятся две метки. Кроме того, я буду использовать анимацию на основе блоков. Используемый вами метод анимации очень старый и не рекомендуется со времен iOS4.
В любом случае…
Сначала вам нужно настроить свой вид следующим образом…
| Screen width |
| |
[ Label ]|[ Label ]|
Две метки должны быть в одном представлении, которое вдвое больше ширины экрана.
Итак, кадр containerView
начнется примерно так…
CGRect containerFrame = CGRectMake(-320, 0, 640, 44);
Затем вы можете сделать это для анимации…
- (void)animateLabels
{
[UIView animateWithDuration:3.0
delay:0.0
options:UIViewAnimationOptionCurveLinear
animations:^{
// animate the container frame to the right 320 points
containerView.frame = CGRectOffset(containerView.frame, 320, 0);
}
completion:^(BOOL finished) {
// move it back to where it started
containerView.frame = CGRectOffset(containerView.frame, -320, 0);
[self animateLabels];
}];
}
При этом две метки будут сдвинуты вправо, а затем быстро возвращены на место и снова начата их анимация. Это создаст иллюзию бесконечного ряда меток, скользящих по экрану.
Комментарии:
1. Спасибо @Fogmeister, я согласен, что этот код работает, но я искал что-то другое. 1. Я хотел бы контролировать синхронизацию и другие анимационные элементы, CA, похоже, может предложить больше. 2. Я намереваюсь создать тяжелую анимацию в этом тикере, мне сказали, что CA был бы лучшим путем, противоположным анимации uiview, что вы думаете по этому поводу 3. трюк с задержкой сработает, но нет ли более приятного и элегантного способа? Тем не менее, спасибо за простое решение, оно может кому-то помочь.
2. Это основная анимация. Вот как вы создаете сложные анимации. Вы даже можете выполнять анимацию ключевых кадров и весеннюю анимацию. И т.д… Используемый вами метод не должен использоваться. Этот метод заменил его около 4 лет назад.
3. достаточно справедливо. вернемся к чертежной доске.