2013-10-03 65 views
1

我想確定包含用戶在iOS 7中點擊的圖像的視圖。下面是我的佈局。如何確定iOS中的UIImageView的超級視圖

+-------------------------------+ 
| 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.但是,當我在class C的hittest中執行self.superview時,它始終爲零。

如何確定UIImageView(C,D,E,F)超級視圖?

如果你想知道,我試圖創建夾點(C,D,E,F)來操縱G中的圖像。我一次在屏幕上有多個A實例,需要知道哪一個是被挖掘的抓地力的超級視圖。

我在這裏錯過了一些概念,並感謝您的指導。

更新:這裏有意見的IB層次:

enter image description here

下面是實際的廈門國際銀行:

enter image description here

下面是在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 
    } 
} 
+0

你說「在C類hitTest裏面」。你是如何確定這一點的。如果你已經分類了'UIImageView'並覆蓋'hitTest',請發佈這個類的代碼。 'hitTest'不會在不在層次結構中的視圖上調用,所以它會有一個超級視圖或是頂層視圖。我的寵物理論是你正在看一個局部變量的'superview',它實際上是'零'。 –

+0

@蒂莫西,我編輯了這篇文章,以便我可以獲取代碼格式。我實際上是直接記錄[self superview]。我也在hitTest中設置了斷點,並且po表明它是零。順便說一下,我在所有hitTest方法中設置了斷點,並且除了gripViews(C,D,E,F)以外,超視圖對所有類都是正確的。我一遍又一遍地瀏覽XIB,看不出什麼奇怪的東西。就像你說的那樣,hitTest是觸發的,所以它在鏈中。 – Dan

+0

除了重寫的'hitTest'方法(例如自定義初始化程序)以外,'GripView'中是否還有其他內容?另外,我會用'[super addSubview:view]'覆蓋'BorderView'的'addSubview''並驗證傳入視圖是否在添加後設置了其'superview'屬性。只是爲了好玩,試着在BorderView中添加一個普通的'UIImageView'。 –

回答

3

嘗試:

UIView *iv = [imageView superView]; 
+0

謝謝,但仍然無 – Dan

+0

我接受你的答案,因爲它應該工作。我必須有一個理由,它不適合我的情況。我現在放棄了這種方法。感謝你的回答! – Dan

0

self.superview應該這樣做。一個提示 - 當你在控制檯上做「自我」,你確定自己是imageView嗎?嘗試分配ImageView的標籤屬性,然後在調試時確保您看到相同的標籤。所有UIViews都有一個標籤屬性。

旁註,視圖的超級視圖,如果它在屏幕上可見。另一個提示 - 你在哪裏/何時拋出這個斷點來停止執行?如果它在C類的init/build方法的某處,superview可能還沒有被分配。確保在屏幕上顯示後查看視圖。你提到一些關於觸摸的東西 - 在tapGestureRecoginizer被擊中後調用BP。

+0

感謝您的回覆。正如我所說,我的測試是在測試中,所以一切都加載。 self被定義爲C類,但self.superview是零。我將修改我的原始問題,以便您可以看到IB層次結構。 – Dan

+0

@Dan當你說「但是,當我在class C的hittest中做self.superview時,它總是零。」在執行中的哪個點你投擲血壓和檢查?你在哪裏看到零?它是否在init方法中? –

+0

我在點擊類C UIImageView時激活的hitTest處理程序中設置斷點。 [self superview]和self.superview返回零。 – Dan

0

將UITapGestureRecognizer添加到您的GripViews中並在點擊時調用委託。確保將userInteractionEnabled屬性設置爲YES。

+0

我已經有userInteractionEnabled。你能解釋爲什麼向這個類添加手勢識別器會改變什麼嗎? B級沒有他們,但超級觀點是有效的。 – Dan

0

如果您嘗試從除主線程以外的任何其他線程獲取UIImageView的超級視圖,則返回nil。此外,中心屬性將包含垃圾值。

相關問題