Масштабирование UIView с использованием преобразования после анимации изменения кадра приводит к тому, что UIView возвращается к исходному кадру перед масштабированием.

Я пытаюсь масштабировать UIView (с анимацией) после его перемещения (с анимацией). Проблема в том, что когда начинается анимация масштабирования, она возвращается в исходное положение. Почему?

[UIView animateWithDuration:t delay:0 options:UIViewAnimationOptionCurveEaseIn animations:^{
    // Drop the ball

    CGRect frame = coinView.frame;
    frame.origin.y += d;

    coinView.frame = frame;

    coinView.shouldSparkle = NO;
} completion:^(BOOL finished) {
    [UIView animateWithDuration:0.3 animations:^{
        // Initial scale up for ball "poof"

        coinView.transform = CGAffineTransformScale(coinView.transform, 1.5, 1.5);
    } completion:^(BOOL finished) {
        [UIView animateWithDuration:0.3 animations:^{
            coinView.transform = CGAffineTransformScale(coinView.transform, 0.000001, 0.000001);
        } completion:^(BOOL finished) {
            [coinView removeFromSuperview];
        }];
    }];
}];

РЕДАКТИРОВАТЬ: вот как я создал свой d:

static CGFloat groundPositionY = 325;

CGRect convertedFrame = [coinView.superview convertRect:coinView.frame toView:self.view];

CGFloat d = groundPositionY - CGRectGetMaxY(convertedFrame);

EDIT2: Хорошо, поэтому я изменил вторую анимацию UIView на следующую и обнаружил, что прыжок (и масштаб вниз) происходит до того, как происходит вторая анимация, то есть когда animateWithDuration:delay:options:animations: завершение: называется.

[UIView animateWithDuration:5 delay:3 options:0 animations:^{
    coinView.transform = CGAffineTransformScale(coinView.transform, 1.5, 1.5);
} completion:nil];

person fumoboy007    schedule 04.01.2013    source источник
comment
Вы пытались удалить вторую и третью анимацию и проверить, сохраняет ли вид свою позицию? Вы что-нибудь делаете с представлением за пределами этого блока кода (я имею в виду, после него)?   -  person sergio    schedule 04.01.2013
comment
Да, у меня есть, и это так. Нет, я не буду касаться этих представлений (или любых представлений в этом отношении) после этого блока кода.   -  person fumoboy007    schedule 04.01.2013
comment
Если я делаю coinView.transform = CGAffineTransformMakeTranslation(0, d); вместо смены кадра, то это тоже делает что-то странное (он сдвигает его на -d в направлении y, а затем анимирует его, становясь положительным в направлении y, пока он не достигнет исходной позиции)   -  person fumoboy007    schedule 04.01.2013
comment
Как вы думаете, имеет ли значение, что содержимое слоя coinView установлено в CGImage? РЕДАКТИРОВАТЬ: я изменил его на подвид UIImageView, и ничего не изменилось.   -  person fumoboy007    schedule 05.01.2013
comment
Масштабирование также обратное (оно уменьшается на -1,5, а затем анимируется до нормального). Почему??   -  person fumoboy007    schedule 05.01.2013
comment
coinView.transform перед вторым блоком анимации CGAffineTransformIdentity.   -  person fumoboy007    schedule 05.01.2013
comment
Включен ли автомакет в вашем xib или раскадровке?   -  person rob mayoff    schedule 05.01.2013


Ответы (2)


Я проверил ваш код, и он отлично работает для меня. Как вы генерируете свой d? а на каком именно блоке он возвращается?

person Maciej Chrzastek    schedule 04.01.2013
comment
На самом деле я не уверен, возвращается ли он в исходное положение, но он определенно прыгает куда-то еще. См. мое редактирование для вопроса о d. Он прыгает, когда начинается второй блок анимации. - person fumoboy007; 04.01.2013
comment
Я использую тот же код, что и вы, и не могу воспроизвести полученную вами ошибку. Я использую кнопку, но для этого это не имеет значения, так как это все еще UIView, и он медленно уменьшается, затем увеличивается и уменьшается. Вы уверены, что не перемещаете свое представление куда-то из-за пределов блока анимации? Поскольку вид мгновенно оказывается в положении, указанном последней анимацией, конечному пользователю требуется время, чтобы увидеть анимацию. - person Maciej Chrzastek; 05.01.2013
comment
Очень уверен. Кроме того, я только что исправил ошибку UIViewAnimationCurveEaseIn должно быть UIViewAnimationOptionCurveEaseIn... но это все равно не исправляет. знак равно - person fumoboy007; 05.01.2013
comment
тогда я не знаю, что не так. Наконец, я бы проверил ту же анимацию с другим видом, таким как кнопка, метка или даже вид изображения, созданный непосредственно перед анимацией. - person Maciej Chrzastek; 05.01.2013
comment
тогда ваш старый вид не работает так, как вы ожидаете, как вы его создаете? примените одну функцию за раз к новому представлению и посмотрите, что происходит - person Maciej Chrzastek; 05.01.2013

Я нашел проблему...

coinView является подвидом представления контроллера дочернего представления. Проблема возникает из-за того, что я переопределил метод viewDidLayoutSubviews этого дочернего контроллера представления, чтобы разместить все coinView, поэтому всякий раз, когда этот метод вызывался, представление монеты возвращалось к исходному положению и размеру, предусмотренным дочерним контроллером представления.

Спасибо за всю вашу помощь, repoguy и sergio!!

person fumoboy007    schedule 04.01.2013