1

我想确定哪个视图包含用户在 iOS 7 中单击的图像。下面是我的布局。

+-------------------------------+
|  A                            |
| +---------------------------+ |
| |B                          | |
| |+--+                   +--+| |
| ||C | ------------------|D || |
| |+--+                   +--+| |
| |  |                      | | |
| |  |          G           | | |
| |  |                      | | |
| |+--+                   +--+| |
| ||E | ------------------|F || |
| |+--+                   +--+| |
| +---------------------------+ |
+-------------------------------+

Legend:
A - UIView
B - UIView subview of A
C, D, E, F - UIImageView subviews of B
G - UIImageView subview of A

我做了整个窗口层次结构的转储,它正确地将 C、D、E、F 显示为 B 和 B 的子视图,G 作为 A 的子视图。整个视图层次结构是在 IB 中构建的,并作为 XIB 加载。

在用户点击 UIImageView C 的情况下,我想找出它的超级视图 B。但是,当我在 C 类的 hittest 内执行 self.superview 时,它总是为零。

如何确定 UIImageView (C, D, E, F) 超级视图?

如果您想知道,我正在尝试创建夹点(C、D、E、F)来操纵 G 中的图像。我一次在屏幕上有多个 A 实例,需要知道哪个是被敲击的握把的超级视图。

我在这里缺少一些概念,并感谢您的指导。

更新:这是视图的 IB 层次结构:

在此处输入图像描述

这是实际的xib:

在此处输入图像描述

这是 C 类 hittest 断点处的视图转储:

UIWindow:<UIWindow: 0xb174590
| UILayoutContainerView:<UILayoutContainerView: 0xb17a7f0
| | UINavigationTransitionView:<UINavigationTransitionView: 0xb17c160
| | | UIViewControllerWrapperView:<UIViewControllerWrapperView: 0xb18f640
| | | | CanvasBackgroundView:<CanvasBackgroundView: 0xa63be10
| | | | | DragView:<DragView: 0xa6aec60
| | | | | | BorderView:<BorderView: 0xa6b92c0
| | | | | | | GripView:<GripView: 0xa6b2480
| | | | | | | GripView:<GripView: 0xa6bb020
| | | | | | | GripView:<GripView: 0xa6b29e0
| | | | | | | GripView:<GripView: 0xa6bb0d0
| | | | | | ContentImageView:<ContentImageView: 0xa6bb340

@Timothy,我所有的 hitTest 方法都是这样的:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    DDLogVerbose(@"%@ superview: %@", NSStringFromClass([self class]), NSStringFromClass([[self superview] class]));
    UIView *hitView = [super hitTest:point withEvent:event];
    if (self == hitView) {
        DDLogVerbose(@"hit for me: %@ %@ %@ self:%@", NSStringFromCGPoint(point), NSStringFromClass([hitView class]), NSStringFromCGRect(hitView.frame), NSStringFromCGRect(self.frame));
        return self; // we handled it
    } else {
        DDLogVerbose(@"hit not for me: %@", NSStringFromCGPoint(point));
        return nil; // not for us
    }
}
4

4 回答 4

3

尝试:

 UIView *iv = [imageView superView];
于 2013-10-03T17:40:50.630 回答
0

self.superview 应该这样做。提示 - 当您在控制台中执行“po self”时,您确定 self 是 imageView 吗?尝试分配 ImageView 的标记属性,然后在调试时确保您看到的是相同的标记。所有 UIView 都有一个 tag 属性。

旁注,一个视图的超级视图(如果它在屏幕上可见)。另一个提示 - 你在哪里/何时抛出这个断点来停止执行?如果它位于 C 类的 init/build up 方法中的某个位置,则可能尚未分配超级视图。确保在视图显示在屏幕上之后查询视图。你提到了一些关于触摸的事情——在点击了 tapGestureRecoginizer 之后调用 BP。

于 2013-10-03T18:25:08.530 回答
0

将 UITapGestureRecognizer 添加到您的 GripViews 并在点击时调用代理。确保将 userInteractionEnabled 属性设置为 YES。

于 2013-10-03T20:35:56.060 回答
0

如果您尝试从主线程以外的任何其他线程获取 UIImageView 的超级视图,它将返回 nil。此外,中心属性将包含垃圾值。

于 2016-07-09T19:32:59.757 回答