繁体   English   中英

如何在iOS中确定UIImageView的超级视图

[英]How do I determine the superview of UIImageView in iOS

我想确定哪个视图包含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)superview?

如果您想知道,我正在尝试创建夹点(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
    }
}

尝试:

 UIView *iv = [imageView superView];

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM