2014-03-29 33 views
2

我想將地圖視圖顯示爲永久性背景,而其他視圖顯示在其頂部(我將設置頂視圖的alpha值爲0.9,以便地圖在底部隱約可見),並在有些地圖顯示。觸摸事件是否可以轉發到MKMapView?

我有一個容器視圖,它被分層在地圖視圖的頂部,我想知道在容器視圖邊界內發生的觸摸事件是否可以傳遞給地圖視圖,以便它可以滾動等。這是一個草圖項目,展示了一個架構的例子。 enter image description here

enter image description here

(容器視圖是在地圖視圖的下半部分,所述容器視圖的頂部和包含視圖控制器的視圖的阿爾法均爲0,所以給用戶的地圖是在整個可見屏幕)。

它很容易將包含的視圖控制器視圖或子視圖控制器內發生的觸摸事件轉發到地圖背景視圖控制器。

如果我做了什麼樣的觸摸事件傳遞給地圖視圖這樣

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    MapBackgroundViewController *parent = (MapBackgroundViewController *) self.parentViewController; 
    [parent.mapView touchesBegan:touches withEvent:event]; 
} 

則什麼也不會發生。

有沒有辦法將touch事件傳遞給地圖視圖,以便它會滾動等?

+0

難道你不能實現這一點,而不使用地圖backgroundviewcontroller的獨立viewcontroller ontop? (也許在mapbackgroundvc中使用子視圖...) – nsuinteger

+0

視圖中太多的事情發生了,在地圖上太多的事情我需要大量的視圖控制器來組織它們。包含的視圖控制器實際上是RVC的整個層次的其他東西。試圖將這一切作爲單獨的觀點來實施將是非常混亂和無組織的。 – Gruntcakes

+0

查看當您將'userInteractionEnabled = NO'設置爲這些頂視圖時會發生什麼。如果是的話,你可以從這一點回來。 – nsuinteger

回答

1

是的,你可以做到這一點。

我所做的是子類UIView並覆蓋hitTest:withEvent:,使觸摸通過,除非觸及子視圖。事情是這樣的:

@implementation PassthroughView 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *view = [super hitTest:point withEvent:event]; 
    return view == self ? nil : view; 
} 

@end 

然後我這個類分配給我的容器視圖和IB所包含的視圖控制器的主視圖。因此,您仍然可以與包含的視圖控制器的內容進行交互,但觸及容器本身會傳遞給地圖。

0

您可以帶上您的覆蓋所有的意見到一個容器視圖,在其中,然後重寫-pointInside:withEvent:返回NO

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return NO; 
} 

這將使視圖有效地「untappable」。

或者,您也可以覆蓋-hitTest:withEvent:返回nil

只需將userInteractionEnabled設置爲NO將不起作用,因爲水龍頭仍會到達視野中並被吞下。