2010-12-12 69 views
5

我使用[aSubview touchesBegan]aSubview在屏幕上的位置與其超級視圖相關聯。它的超級視圖並不比子視圖本身大。這是很簡單的做,因爲下面的代碼片段顯示:touchesBegan停止工作,當視圖移到超級視圖之外

UITouch* touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:[self superview]]; 
    self.center = touchPoint; 

但是一旦aSubview移動,只要它的任何部分屬於它的父的邊界之外,倒是在這一節中不再登記。換句話說,touchesBegan不再起火。我希望aSubview可以註冊,無論它的移動位置與其超級視圖相關。

有什麼想法?
Howard

回答

0

我不確定這是否是正確的方法,但它肯定是一種方法。

即使在您的父母對象中,也可以聽到touchesBegin。 如果你得到一個事件,通過調用它的touchesBegin將它傳遞給childs視圖。

+0

我不喜歡這樣做,因爲我必須弄清楚確定命中是否是孩子的觀點與否的方式(這當然不難,但我不應該那樣做)。這實際上比這更糟糕,因爲我將有大量的子視圖,並且必須確定哪一個被擊中。它增加了我認爲不必要的複雜性 - 如果我能弄清楚爲什麼它現在不能正常工作。 – hkatz 2010-12-12 21:47:27

1

我已經跟一位蘋果工程師談過這件事。 touchesBegan將無法​​在子視圖的不包含w /在其超級視圖中的部分工作,因爲當系統嘗試確定哪個子視圖的touchesBegan被調用時,該系統會在層次結構中剪切每個子視圖。

爲了解決這個問題,我刪除了導致剪輯問題的中間包裝視圖,並將子視圖提升了一級。這需要邏輯上的小改動,但最終被證明是一個更清潔的解決方案 - 更重要的是,它是一個有效的解決方案。

2

我剛剛有這個問題,沒有收到輸入的子視圖,因爲superview只是沒有發送觸摸事件的邊界以外的子視圖。此外,保持超級觀點的界限至關重要,並且將子視圖移到層次結構上也是不可行的。對我來說,這項工作壓倒了超級觀點

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 

總是返回YES。結果:超視圖和子視圖幾乎沒有任何變化,但輸入是在超視圖的邊界外接收的。

5

mcpunky的回答幾乎不錯,除了你可以不是使pointInside函數總是返回YES。這樣視圖將攔截所有的觸摸。

相反,人們需要做的更細的檢查:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ 

    return CGRectContainsPoint(self.subviewOutsideMe.frame, point) || CGRectContainsPoint(self.bounds, point); 

} 
+0

根據你的情況,你也可以考慮重寫' - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event'而不是'pointInside' – 2013-09-13 14:58:42

+0

pointInside:如果視圖的子視圖在外面儘管如此,超級觀點的界限。對? – Remover 2013-11-14 17:26:41

相關問題