阻止 UIImageView 返回到其在视图中的原始位置?

Posted

技术标签:

【中文标题】阻止 UIImageView 返回到其在视图中的原始位置?【英文标题】:Stop a UIImageView from returning to its original location in a View? 【发布时间】:2013-05-30 03:42:30 【问题描述】:

我正在研究一个非常简单的 Ray Wenderlich ios“拖动”示例,其中 2 个UIImageViews(一只猴子和一个香蕉)可以在屏幕上拖动。它在 ViewController 实现文件中使用了UIPanGestureRecognizer

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer 

    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];


这很好,猴子和香蕉会停留在你将它们拖到的任何位置。但是,我希望单击(触摸)任何UIImageView 以成为最顶部的视图。我胡闹了一下,想出了这行代码:

 [self.view bringSubviewToFront:recognizer.view];

我将它放在 handlePan 方法中,它确实会将点击(触摸)的任何图像带到前面,但它会将前一个图像重置为其在屏幕上的原始位置。如果我省略将触摸的子视图放在前面的代码行,它就不会这样做。

将选定的子视图置于最前面并将其他图像重置为其原始位置的原因是什么?在UIPanGestureRecognizer 中如何防止这种情况发生?不走touchesBegantouchesEnded等方法路线?

显然我是 ios 编程的新手,但我找不到可能是一个简单问题的答案。谢谢大家...任何帮助表示赞赏...

【问题讨论】:

这可能是自动布局问题。尝试关闭自动布局,看看问题是否消失。 你能用bringSubviewToFront 方法调用发布你的完整代码吗?我刚刚尝试了示例代码,它适用于 bringSubviewToFront 方法。 【参考方案1】:

我在这里重新创建了您的来源。问题是自动布局,您需要禁用它。因为当您将视图置于前面时,它会将规则应用于另一个视图以检查位置,并将其重新定位到原来的位置。

那么,为什么在您更改框架时不会发生这种情况?当您只更改框架时,它不会在您每次更改一个视图的中心时应用自动布局规则,它只会在您的视图容器层次结构更改或视图容器框架更改时应用。

就像您告诉您正在编写 Ray Wenderlich 教程一样,我会建议您查看 the tutorial about autolayout。 Ray Wenderlich 网站中的材料是一个很好的起点。

--

对禁用自动布局有一点帮助,在 .xib 和故事板中,选择视图并禁用复选框:

【讨论】:

哇,非常感谢您的回答。似乎自动布局是问题所在。我一直在学习一些教程,由于我知道自动布局,但还不了解它,所以在设置新项目时我总是将其关闭。我确信这次我也这样做了……完全是我的错。另外,感谢您准确解释重新排列视图层次结构时会发生什么,因为它与应用自动布局规则有关。那条评论非常非常有帮助。

以上是关于阻止 UIImageView 返回到其在视图中的原始位置?的主要内容,如果未能解决你的问题,请参考以下文章

阻止UIScrollView中的UISlider触发滚动

为啥更改 UIImageView 内容模式会影响其在 Xcode6 中的自动布局?

旋转iOS的UIImageView问题

uiimageview 保留滚动视图缩放的位置

UIImageView 大小变化

UITapGestureRecognizer 似乎没有被它的子视图阻止,这正常吗?