iPhone / iPad - базовая анимация - CGAffineTransformMakeTranslation не изменяет кадр - PullRequest
4 голосов
/ 21 декабря 2011

У меня очень неприятная проблема.Вот контекст: у меня есть «прямоугольный» вид, который является подпредставлением основного вида.То, что я пытаюсь сделать, это просто, когда я нажимаю на кнопку, я хочу, чтобы представление «прямоугольник» переместилось по оси x, чтобы исчезнуть.Затем я добавляю новое подпредставление и перевожу его, чтобы занять место предыдущего представления «прямоугольник».Это нормально работает, за исключением того, что если я нажму кнопку еще раз, анимация начнется с экрана, как CGAffineTransformMakeTranslation не изменил кадр моего нового представления «прямоугольник».Вот код:

UIView *rectangleView = [detailView viewWithTag:4]; //the actual frame is (20.0, 30.0, 884.0, 600.0)

[UIView animateWithDuration:0.5 animations:^{
    [rectangleView setTransform:CGAffineTransformMakeTranslation(-1000, 0)];
} completion:^(BOOL finished) {
    [rectangleView removeFromSuperview];
    UIView *otherView = [[UIView alloc] initWithFrame:CGRectMake(1020.0, 30.0, 884.0, 600.0)];
    [otherView setBackgroundColor:[UIColor purpleColor]];
    [otherView setTag:4];
    [detailView addSubview:otherView];
    [UIView animateWithDuration:0.5 animations:^{
        [otherView setTransform:CGAffineTransformMakeTranslation(-1000, 0)];
    } completion:^(BOOL finished) {
        [otherView release];
    }];
}];

Ответы [ 2 ]

3 голосов
/ 21 декабря 2011

После добавления второго вида вы уже устанавливаете его преобразование равным CGAffineTransformMakeTranslation(-1000, 0), а когда вы хотите удалить это представление, вы устанавливаете точно такое же преобразование - так что оно не будет иметь никакого эффекта.У вас есть 2 варианта:

  1. Применить перевод к преобразованию, которое уже имеет представление:

    CGAffineTransform newTransform = CGAffineTransformConcat(rectangleView.transform, CGAffineTransformMakeTranslation(-1000, 0));
    [rectangleView setTransform:newTransform];
    
  2. Вместо применения преобразований работать с представлениемположение напрямую (например, через его свойство center)

    UIView *rectangleView = [detailView viewWithTag:4]; //the actual frame is (20.0, 30.0, 884.0, 600.0)
    CGAffineTransform tf = CGAffineTransformMakeTranslation(-1000, 0);
    [UIView animateWithDuration:0.5 animations:^{
        [rectangleView setCenter: CGPointApplyAffineTransform(rectangleView.center, tf)];
    } completion:^(BOOL finished) {
        [rectangleView removeFromSuperview];
        UIView *otherView = [[UIView alloc] initWithFrame:CGRectMake(1020.0, 30.0, 884.0, 600.0)];
        [otherView setBackgroundColor:[UIColor purpleColor]];
        [otherView setTag:4];
        [detailView addSubview:otherView];
        [UIView animateWithDuration:0.5 animations:^{
            [otherView setCenter: CGPointApplyAffineTransform(otherView.center, tf)];
        } completion:^(BOOL finished) {
            [otherView release];
        }];
    }];
    
1 голос
/ 21 декабря 2011

Попробуйте анимировать свойство center вместо использования аффинного преобразования.Преобразования не являются аддитивными, поэтому ваша вторая анимация (когда ваш недавно добавленный подробный вид затем перемещается за пределы экрана) фактически не меняет представление, поскольку к нему уже применен этот перевод (-1000,0).

...