Использование UIPanGestureRecognizer и CATransform3DScale для увеличения перетаскиваемого элемента - PullRequest
0 голосов
/ 13 августа 2010

Я хочу реализовать отложенную «увеличивающую» анимацию в UIView, который перетаскивается с помощью подключенного UIPanGestureRecognizer. Я использовал что-то похожее на следующий код:

UIView* innerView;
CGPoint startingPoint;

- (void)viewDidLoad { 
        innerView = [[[UIView alloc] autorelease] initWithFrame:CGRectMake(0, 0, 200, 200)];
    [[self view] addSubview:innerView];

    [innerView setBackgroundColor:[UIColor blueColor]];

    [innerView addGestureRecognizer:[[[UIPanGestureRecognizer alloc] autorelease] initWithTarget:self action:@selector(pan:)]];

    // resize it later
    [self performSelector:@selector(anim) withObject:nil afterDelay:1.5];
}

 -(void)pan:(UIPanGestureRecognizer*)gr {
    CGPoint gesturePoint = [gr translationInView:[self view]];

    if (gr.state == UIGestureRecognizerStateBegan)
            startingPoint = innerView.center;
    else
        innerView.center = CGPointMake(startingPoint.x + gesturePoint.x,         startingPoint.y +gesturePoint.y);
}

-(void)anim{
    innerView.layer.transform = CATransform3DMakeScale(1.5, 1.5, 1);
}

Но представление «прыгает» при перетаскивании после применения масштаба. Такое поведение происходит не всегда, но псевдослучайно. Кто-нибудь может пролить свет на этот вопрос или предложить другой подход?

1 Ответ

1 голос
/ 13 августа 2010

Попробуйте выполнить преобразование на виде вместо слоя, чтобы метод -anim выглядел следующим образом:

-(void)anim
{
    [UIView beginAnimations:nil context:NULL];
    [innerView setTransform:CGAffineTransformMakeScale(1.5f, 1.5f)];
    [UIView commitAnimations];
}

Проблема в том, что в корневом слое вида анимации отключены по умолчанию, поэтому он просто привязывается к заданному вами преобразованию.

В качестве альтернативы, если вам нужно анимировать слой, вы можете использовать явную анимацию, используя CABasicAnimation .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...