简体   繁体   English

旋转180 *后,UIImageView的旋转移动比例会反向移动

[英]rotating moving scaling of UIImageView moving inversly after rotating by 180*

Here is my code for moving,scaling and rotating the UI ImageView all work fine but the issue is when we rotate the ImageView it rotates but after then it move inversely like i am dragging toward right but the ImageView is going left cant we get the current center point after rotating so that we when we drag the center points are of that rotated ImageView not original one 这是我用于移动,缩放和旋转UI ImageView代码,都可以正常工作,但是问题是当我们旋转ImageView它旋转了,但是此后它却反向移动,就像我向右拖动但ImageView向左移动,无法得到当前的旋转后的中心点,以便当我们拖动中心点时,该点是旋转的ImageView而不是原始的

this is the custom class inherited by UIImageView 这是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];

}

2 options: 2种选择:

  1. Use CGAffineTransformTranslate the same way you've been using Scale and Rotate . 使用CGAffineTransformTranslate的方式与使用ScaleRotate方式相同。
  2. Better yet, reset the affine transform, move the image view, then set the transform back. 更好的是,重置仿射变换,移动图像视图,然后重新设置变换。

Try this code for option 2: 尝试将此代码用于选项2:

CGAffineTransform t = self.transform;
self.transform = CGAffineTransformIdentity;
[self setCenter:translatedPoint];
self.transform = t;

by changing this line in -(void)move:(id)sender just got my task done 通过在-(void)move:(id)sender中更改此行,我的任务就完成了

Older 较旧

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

Correct 正确

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM