Как анимировать перемещение UILabel с автоматическими ограничениями макета?

Я пытаюсь переместить UILabel влево и анимировать движение. UILabel создается из раскадровки и имеет следующие ограничения:

введите здесь описание изображения

Но если я попытаюсь сделать конечный пробел постоянным, равным, скажем, 150 вместо 20, чтобы переместить его влево, он странно отскакивает влево на секунду, а затем возвращается в середину. Поэтому я понизил приоритет левого ведущего ограничения до 900, но все равно произошло то же самое.

Итак, я попытался:

self.textToReadLabel.transform = CGAffineTransformMakeTranslation(-500.0, 0.0);

Который перемещает его, но если я использую с ним анимацию, он соскальзывает с экрана, скользит обратно, а затем останавливается на том месте, где должен... после всей этой театральности.

Как именно я могу этого добиться?

Все, что происходит, когда я нажимаю кнопку, чтобы переместить метку:

        self.textHorizontalPlacementConstraint.constant = 150.0;
        self.textHorizontalPlacementConstraint2.constant = -110.0;
        [UIView animateWithDuration:1.0 animations:^{
            [self.view layoutIfNeeded];
        }];

        CATransition *animation = [CATransition animation];
        animation.duration = 0.5;
        animation.type = kCATransitionFade;
        animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        [self.textToReadLabel.layer addAnimation:animation forKey:@"changeTextTransition"];

        // Change the text
        self.textToReadLabel.text = @"text";
    }

person Doug Smith    schedule 04.10.2013    source источник


Ответы (1)


Чтобы анимировать изменение макета, вам нужно изменить constant в вашем NSLayoutConstraint, а затем вызвать:

    self.textHorizontalPlacementConstraint.constant = 150.0;
    self.textHorizontalPlacementConstraint2.constant = -110.0;
    [UIView animateWithDuration:1.0 animations:^{
        [self.view layoutIfNeeded];
    }];

Также убедитесь, что ваши ограничения последовательны. Поэтому, если вы увеличиваете trailingSpace, также уменьшите leadingSpace.

person Mike Pollard    schedule 04.10.2013
comment
Как я уже сказал, я пытался изменить константу (включая вызов layoutIfNeeded). Пробовал менять оба, но получилось то же самое. Он вылетает за пределы экрана на секунду, а затем снова появляется. - person Doug Smith; 04.10.2013
comment
Я добавил код, но он не кажется особенно полезным. Есть ли что-то еще, что я мог бы добавить? - person Doug Smith; 04.10.2013
comment
Пробовал, но эффект тот же. Вот видео того, о чем я говорю, возможно, оно поможет: cl.ly/3l2E401N3Q3h РЕДАКТИРОВАТЬ: И Я добавил буквально весь код, который, по моему мнению, может иметь значение. - person Doug Smith; 04.10.2013