iOS 在容器内移动视图会混淆触摸区域

Posted

技术标签:

【中文标题】iOS 在容器内移动视图会混淆触摸区域【英文标题】:iOS moving views within a container confuses the touch region 【发布时间】:2013-01-09 20:11:46 【问题描述】:

我故意在视图容器中放置了 2 个视图(表视图),它们部分重叠。视图 B 与视图 A 的大约 50% 重叠。

当我以编程方式移动视图 B 使其不再重叠时,视图 A 中先前重叠的区域不会响应触摸事件,也就是说,约 50% 不会。只有最初没有重叠的区域才会这样做。此外,在视图 B 中,现在在父视图中占用新空间的部分不响应触摸事件,只响应恰好占用旧区域的视图部分。

我用来移动视图的代码很简单:

UIView* viewB = [self.childViewControllers.lastObject view];

CGRect rect = viewB.frame;
rect.origin.x += 200;

[UIView animateWithDuration:0.2 animations:^
    viewB.frame = rect;
];

在视觉上,视图会移动,但触摸区域不会。

我使用 ios 6 中新的故事板“容器视图”机制来最初放置视图。

我不知道为什么会这样。有什么想法吗?

谢谢。

【问题讨论】:

我使用的动画块与问题无关。事实上,我根本不需要动画块,问题仍然存在。如果我希望在动画期间进行用户交互,建议的选项很有用。这不像触摸事件不起作用,它们在视图的一部分上不起作用 - 它最初重叠的部分。就好像我的应用仍然认为我的视图没有移动一样。 【参考方案1】:

事实证明,当 xCode 在我的故事板中添加“容器视图”时,它会将我的视图嵌入到父视图中。所以我需要做以下事情:

UIView* viewB = [[self.childViewControllers.lastObject view] superview];

CGRect rect = viewB.frame;
rect.origin.x += 200;

[UIView animateWithDuration:0.2 animations:^
    viewB.frame = rect;
];

因为容器将我的视图嵌入到它自己的视图中,所以我需要获取超级视图并使用它。

如果我以编程方式完成所有这些操作,即添加容器并使用容器 API 查看我自己,我的原始代码就可以工作。

【讨论】:

哇,这已经困扰了我一个小时了。感谢您发布您自己问题的答案!

以上是关于iOS 在容器内移动视图会混淆触摸区域的主要内容,如果未能解决你的问题,请参考以下文章

在容器内移动页面控件

如何在Swift中移动容器视图

iOS Swift ScrollView、UITableView、滚动区域

子 UIViewController 视图阻止容器 UIViewController 视图接收触摸事件

使用电容器在iOS应用构建中滚动时如何防止内容显示在安全区域上方?

iOS - Swift - UIImage 上的可点击区域