вращающееся движущееся масштабирование UIImageView, перемещающееся в обратном направлении после поворота на 180 *

Вот мой код для перемещения, масштабирования и поворота UIImageView, все работает нормально, но проблема в том, что когда мы поворачиваем ImageView, он вращается, но после этого он движется в обратном направлении, как будто я перетаскиваю вправо, но ImageView идет влево, мы не можем получить текущий центр точка после поворота, так что мы, когда мы перетаскиваем центральные точки, относятся к этой повернутой ImageView, а не к исходной

это пользовательский класс, унаследованный UIImageView

#pragma mark Manipulation
-(void)scale:(id)sender {
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) 
{
        _lastScale = 1.0;
    }

    CGFloat scale = 1.0 - (_lastScale - [(UIPinchGestureRecognizer*)sender scale]);

    CGAffineTransform currentTransform = self.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

    [self setTransform:newTransform];


    _lastScale = [(UIPinchGestureRecognizer*)sender scale];
    [self showOverlayWithFrame:self.frame];
}


-(void)rotate:(id)sender {

    if([(UIRotationGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) {

        _lastRotation = 0.0;

        return;
    }


    CGFloat rotation = 0.0 - (_lastRotation - [(UIRotationGestureRecognizer*)sender rotation]);

    CGAffineTransform currentTransform = self.transform;
    CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation);

    [self setTransform:newTransform];
    _lastRotation = [(UIRotationGestureRecognizer*)sender rotation];

    [self showOverlayWithFrame:self.frame];





}


-(void)move:(id)sender {

    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self];

     if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) {
         _firstX = [self center].x;
         _firstY = [self center].y;
    }

    translatedPoint = CGPointMake(_firstX+translatedPoint.x, _firstY+translatedPoint.y);

    [self setCenter:translatedPoint];


    [self showOverlayWithFrame:self.frame];

}

person umairhhhs    schedule 20.11.2013    source источник


Ответы (2)


2 варианта:

  1. Используйте CGAffineTransformTranslate так же, как вы использовали Scale и Rotate.
  2. А еще лучше сбросьте аффинное преобразование, переместите вид изображения, а затем установите преобразование обратно.

Попробуйте этот код для варианта 2:

CGAffineTransform t = self.transform;
self.transform = CGAffineTransformIdentity;
[self setCenter:translatedPoint];
self.transform = t;
person Guy Kogus    schedule 20.11.2013
comment
Хорошо, позвольте мне попробовать оба этих варианта. - person umairhhhs; 20.11.2013
comment
спасибо за ваш, но это не приятно, проверьте мой ответ сейчас - person umairhhhs; 21.11.2013

изменив эту строку в -(void)move:(id)sender только что выполнил свою задачу

Старшая

CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self];

Правильный

CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:[self superview]];
person umairhhhs    schedule 21.11.2013