RotationGesture 后平移 UIView 导致视图折叠

Posted

技术标签:

【中文标题】RotationGesture 后平移 UIView 导致视图折叠【英文标题】:Panning UIView after RotationGesture Causes view to collapse 【发布时间】:2012-02-10 16:29:47 【问题描述】:

我将尝试用文字来描述一些只能用视频来描述的东西。

我创建了一个简单的 ios 应用程序,其中包含一个包含单个图像视图的情节提要。我添加了两个手势识别器:一个 UIPanGestureRecognizer 和一个 UIRotationGestureRecognizer 以及它们对应的 IBActions。

当我第一次在模拟器中启动应用程序时,图像视图可以正确平移。图像视图也正确旋转。然而,在旋转之后,任何后续的平移都会失败。当我尝试在旋转后平移时,无论平移的方向如何,图像都会迅速缩放到零并消失,即它会塌陷或内爆到消失的点。

手势识别器是使用以下代码创建的。 myImageView 设置为 IBOutlet UIImageView。

UIPanGestureRecognizer *panRec = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(processPan:)];
[myImageView addGestureRecognizer:panRec];
UIRotationGestureRecognizer *rotRec = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(processRotation:)];
[myImageView addGestureRecognizer:rotRec];

我已经尽我所知编写了相关的操作。它们基本上是对我在 iOS 文档中找到的方法的轻微修改。如下所示。

-(IBAction)processPan:(UIPanGestureRecognizer *)sender

    if(sender.state == UIGestureRecognizerStateChanged)
    
        CGPoint translation = [sender translationInView:self.view];
        CGRect newFrame = myImageView.frame;
        newFrame.origin.x += translation.x; 
        newFrame.origin.y += translation.y;
        myImageView.frame = newFrame;
        [sender setTranslation:CGPointMake(0, 0) inView:self.view];
    


-(IBAction)processRotation:(UIRotationGestureRecognizer *)sender

    if(sender.state == UIGestureRecognizerStateChanged)
    
        myImageView.transform = CGAffineTransformRotate(myImageView.transform, sender.rotation);
        [sender setRotation:0];
    

那么我错过了什么?我是新手,所以希望我的无知会被容忍。

如果有帮助,我将在 MacBook 上的 OS X 版本 10.7.3 上运行 Xcode 版本 4.2.1。非常感谢您花时间阅读我的问题。 Stack Overflow 是一个令人难以置信的资源!

-戴夫

【问题讨论】:

两个手势都可能因为正在观看的视图上进行旋转而中断。您可以尝试在 UIImageView 顶部添加一个清晰的视图,并将识别器附加到清晰的视图上。 【参考方案1】:

好吧,我不知道我是否想出了一个解决方案,或者我是否想出了一个杂牌。基本上,泛代码对我不起作用。任何时候旋转或缩放视图,平移代码都会严重扭曲或折叠正在翻译的视图。我盯着变换矩阵和框架坐标系,直到我快要失明了。

我在第一篇文章中列出的翻译代码基本上是从 Apple 的 iOS 事件处理指南的手势识别器部分的清单 3-2“处理捏合、平移和双击手势”中复制的,所以我想它会为我解决问题。好吧,我最终使用 UIImageView 中心为它编写了自己的代码,而根本没有弄乱框架。这对我有用。

CGPoint translation = [sender translationInView:self.superview];
CGPoint newCenter = CGPointMake(self.myImageView.center.x + translation.x, self.myImageView.center.y + translation.y);
[self.myImageView setCenter:newCenter];
[sender setTranslation:CGPointMake(0, 0) inView:self.superview];

我使用 superview 作为翻译的参考,以防它被旋转。现在好像可以了。

这项努力可能揭示了我对框架的理解是如何不正确的。如果有人能告诉我如何纠正我的理解,我将不胜感激。

-戴夫

【讨论】:

以上是关于RotationGesture 后平移 UIView 导致视图折叠的主要内容,如果未能解决你的问题,请参考以下文章

一个图形经过平移后,与原图形成轴对称对吗?

二次函数 左右平移后的解析式怎么求? 关于原点 X轴 Y轴对称后解析式怎么求? 急!!!!!!!!!!!!

旋转后平移手势行为不正确

UIScrollView 直到缩放用户操作后才平移

缩放后无法平移 UIScrollView

缩放和平移画布后鼠标坐标不匹配