Основной цикл анимации без пробелов

#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. достаточно справедливо. вернемся к чертежной доске.