【问题标题】:Scaling UIImageView inside UIScrollView with maintaining the rotation在 UIScrollView 内缩放 UIImageView 并保持旋转
【发布时间】:2012-08-06 21:03:21
【问题描述】:

我在缩放放置在 uiscrollview 内的 uiimageview 时遇到问题。我也在 StackOverflow 中搜索并检查了与我的问题相关的所有问题。我也尝试了 StackOverflow 中发布的所有答案。没有什么对我有用。

首先,我将 uiimageview 放在 nib 文件中的 uiscrollview 中,然后从相机胶卷中获取图像并填充图像视图。然后我使用 uirotationgesturerecognizer 来旋转图像。

这是我正在尝试做的代码。

- (void)viewDidLoad
{
 [super viewDidLoad];
 NSLog(@"%@",[[UIDevice currentDevice] model]);

// Do any additional setup after loading the view, typically from a nib.
 self.imagePicker = [[[UIImagePickerController alloc] init] autorelease];

 self.picChosenImageView.layer.shouldRasterize = YES;
 self.picChosenImageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

 self.picChosenImageView.layer.contents = (id)[UIImage imageNamed:@"test"].CGImage;
 self.picChosenImageView.layer.shadowColor = [UIColor blackColor].CGColor;
 self.picChosenImageView.layer.shadowOpacity = 0.8f;
 self.picChosenImageView.layer.shadowRadius = 8;
 self.picChosenImageView.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.picChosenImageView.bounds].CGPath;

 UIRotationGestureRecognizer *rotationRecognizer = [[[UIRotationGestureRecognizer alloc]initWithTarget:self
                                                                                               action:@selector(handleRotate:)] autorelease];
 rotationRecognizer.delegate = self;
 [self.picChosenImageView addGestureRecognizer:rotationRecognizer];

 self.containerView.delegate = self;
 self.containerView.contentSize = self.picChosenImageView.layer.frame.size;
 self.containerView.maximumZoomScale = 4.0f;
 self.containerView.minimumZoomScale = 1.0f;
 angle = 0.0f;
 useRotation = 0.0;
 isRotationStarted=FALSE;
 isZoomingStarted = FALSE; 
}

-(void)lockZoom
{
 maximumZoomScale = self.containerView.maximumZoomScale;
 minimumZoomScale = self.containerView.minimumZoomScale;

 self.containerView.maximumZoomScale = 1.0;
 self.containerView.minimumZoomScale = 1.0;
 self.containerView.clipsToBounds = false;
 self.containerView.scrollEnabled = false;
}

-(void)unlockZoom
{
    self.containerView.maximumZoomScale = maximumZoomScale;
    self.containerView.minimumZoomScale = minimumZoomScale;
    self.containerView.clipsToBounds = true;
    self.containerView.scrollEnabled = true;
}

#pragma mark - ScrollView delegate methods

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return  self.picChosenImageView;
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{

    CGRect frame = self.picChosenImageView.frame;
    frame.origin = CGPointZero;
    self.picChosenImageView.frame = frame;
    //self.picChosenImageView.transform = prevTransform;

}

-(void) scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
    if(!isZoomingStarted)
    {
        self.picChosenImageView.transform = CGAffineTransformRotate(self.picChosenImageView.transform, angle);
        NSLog(@"The zooming started");
        isZoomingStarted = TRUE;
        CGSize contentSize = self.containerView.bounds.size;
        CGRect contentFrame = self.containerView.bounds;
        NSLog(@"frame on start: %@", NSStringFromCGRect(contentFrame));
        NSLog(@"size on start: %@", NSStringFromCGSize(contentSize));
        //prevTransform = self.picChosenImageView.transform;
    }
}

-(void) scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(float)scale
{
    if(isZoomingStarted)
    {
        self.picChosenImageView.transform = CGAffineTransformRotate(self.picChosenImageView.transform, angle);
        isZoomingStarted = FALSE;
        CGSize contentSize = self.containerView.contentSize;
        CGRect contentFrame = self.containerView.bounds;
        NSLog(@"frame on end: %@", NSStringFromCGRect(contentFrame));
        NSLog(@"size on end: %@", NSStringFromCGSize(contentSize));
    }
}

#pragma mark - GestureRecognizer methods

- (void) handleRotate:(UIRotationGestureRecognizer *)recognizer
{
    if(isZoomingStarted == FALSE)
    {
        if([recognizer state] == UIGestureRecognizerStateBegan)
        {
            angle = 0.0f;
            [self lockZoom];
        }

        useRotation+= recognizer.rotation;

        while( useRotation < -M_PI )
        {
            useRotation += M_PI*2;
        }
        while( useRotation > M_PI )
        {
            useRotation -= M_PI*2;
        }
        NSLog(@"The rotated value is %f",RADIANS_TO_DEGREES(useRotation));
        self.picChosenImageView.transform = CGAffineTransformRotate([self.picChosenImageView transform],
                                                                    recognizer.rotation);
        [recognizer setRotation:0];

        if([recognizer state] == UIGestureRecognizerStateEnded)
        {
            angle = useRotation;
            useRotation = 0.0f;
            isRotationStarted = FALSE;
            self.containerView.hidden = NO;
            //prevTransform = self.picChosenImageView.transform;
            [self unlockZoom];
        }
    }
}

我的问题是,我能够成功地进行放大和缩小。我可以随心所欲地旋转 uiimageview。将 uiimageview 旋转到某个角度后,当我尝试放大时,imageview 会回到原始位置(将自身旋转回零度),然后进行缩放。我想保留旋转并缩放。我尝试保存以前的转换并在后面的 scrollDidzoom 和 scrollDidBegin 委托方法中分配。没有工作。请帮我找出我忽略的错误。

【问题讨论】:

  • 在scrollViewWillBeginZooming和endZooming中加入以下代码,让imageview回到原来的旋转 self.picChosenImageView.transform = CGAffineTransformRotate(self.picChosenImageView.transform, angle);
  • 但我无法保留图像视图的旋转,而缩放正在发生,我的意思是在 scrollviewdidZoom 时
  • 我面临同样的问题。问题是 setZoomScale-Method。它覆盖了应用的旋转。见stackoverflow.com/questions/12006171/…

标签: iphone objective-c ios uiscrollview uigesturerecognizer


【解决方案1】:

尝试使用CGAffineTransformScale,而不是仅仅调整框架的大小以进行缩放:

anImage.transform = CGAffineTransformScale(anImage.transform, 2.0, 2.0);

更改缩放转换可能会解决您的旋转问题。

希望这会有所帮助。

【讨论】:

  • 我试过这样做。滚动视图中的图像按比例因子 2 放大,但我无法滚动到图像的其他部分。只有在滚动视图中看到的图像才会被缩放。我假设,你的代码进入 scrollViewDidZoom
  • 好吧,而不是在上面的代码中使用 2.0,你应该使用比例因子......但无论如何,在再次查看你的代码后,我认为这不是问题......似乎它必须与scrollViewWillBeginZooming:.. 你为什么有`self.picChosenImageView.transform = CGAffineTransformRotate(self.picChosenImageView.transform, angle); ` 用那种方法?并且在每个缩放周期后角度不会重置吗?
  • 好吧,如果我从 scrollViewWillBeginZooming 中删除那行代码。我面临同样的问题。我可以看到问题出在 scrollViewDidZoom 中,我正在为 imageview 重置框架。如果我删除 imageview 中的图像变得不可见,我的意思是内容会偏移。希望,我正在努力向您解释清楚。
【解决方案2】:

我遇到了同样的问题。 UIScrollView 正在控制 UIImageView,它使用的是没有旋转的变换。

所以我没有为滚动提供图像参考,并且我添加了 UIPinchGestureRecognizer 用于缩放。

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
  return nil
}

拖动仍在工作:)

// viewDidLoad
var pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(pinchRecogniezed))
scrollView.addGestureRecognizer(pinchGestureRecognizer)


func pinchRecogniezed(sender: UIPinchGestureRecognizer) {
    if sender.state == .Began || sender.state == .Changed {
        let scale = sender.scale
        imageView.transform = CGAffineTransformScale(imageView.transform, scale, scale)
        sender.scale = 1
    }
}

【讨论】:

    猜你喜欢
    • 2012-12-28
    • 1970-01-01
    • 2012-03-20
    • 2018-10-01
    • 2016-03-19
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    相关资源
    最近更新 更多