2014-09-26 90 views
4

我有一個浮動UIView頭低於UINavigationBar。我已經將它作爲索引0處的子視圖插入,因此我可以根據UITableView的contentOffset將其設置爲動畫。UINavigationBar下的浮動標題作爲子視圖 - 接收觸摸?

但是,因爲它超出了UINavigationBar的範圍,因此在向其添加UITapGestureRecognizer後,我無法在此視圖中接收觸摸事件。所有觸摸事件都會轉到它下面的UITableView

任何想法,如果有可能有一個子視圖超出導航欄的邊界,並接收觸摸事件嗎?

我這樣做是因爲將它添加爲UITableView的子視圖,我必須在滾動時根據contentOffset設置Y原點,這也會使動畫非常困難,因爲Y原點在滾動期間發生更改,所以我可以不知道在哪裏製作動畫。

它與Facebook應用程序中的「狀態」,「照片」和「檢入」按鈕相似。

感謝

回答

2

您需要創建自定義UINavigationBar的並重新實現pointInside:withEvent:延長導航欄的觸摸區域(添加視圖區域):

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    CGRect extendedRect = self.frame; 
    extendedRect.size.height += MENU_HEADER_HEIGHT - self.frame.origin.y; 
    BOOL pointInside = NO; 
    if (CGRectContainsPoint(extendedRect, point)) { 
     pointInside = YES; 
    } 
    return pointInside; 
} 
0

據我知道你不能接受一個觀點的界限之外的觸摸事件。所以,我看到幾個選項:

首先,您可以選擇將其作爲子視圖添加到UITableView,如您所說,然後根據tableview的contentOffset調整它的Y原點。當你想製作動畫,而不是將其動畫到一個特定的y位置,你可以做這樣的事情:

[UIView animateWithDuration:0.4 
       animations:^{ 
        _myHeaderView.frame = CGRectOffset(_myHeaderView.frame, 0.0, -_myHeaderView.frame.size.height); 
       }]; 

另一種選擇,我可以看到的是將一切的頂部的標題視圖,但它的起源坐就在UINavigationBar的下方。然後,當您製作動畫時,您可以將它移動到UINavigationBar以下(甚至實際傳遞到UINavigationBar),然後在其之後進行動畫處理,以便在其下滑動。

+0

是啊,我想後面的選項作爲最後選項。再次,滾動的偏移量會發生變化,所以想象您快速滾動,這意味着您將其設置爲不再有效的位置。感謝您的建議。 – runmad 2014-09-26 18:43:26

+0

哦,你是說你想在滾動的同時進行動畫處理嗎?或者在滾動時將其固定到位? – sfeuerstein 2014-09-26 19:27:33

1

添加到上面的回答。這是我做的。

class CustomNavigationBar: UINavigationBar { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     if(self.pointInside(point, withEvent: event)){ 
      self.userInteractionEnabled = true 
     }else{ 
      self.userInteractionEnabled = false 
     } 

     return super.hitTest(point, withEvent: event) 
    } 

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
     var extendedRect:CGRect = self.frame 
     extendedRect.size.height += 100.0 - self.frame.origin.y 
     var pointInside:Bool = false 

     if(CGRectContainsPoint(extendedRect, point)){ 
      pointInside = true 
     } 
     return pointInside 
    } 
} 
0

斯威夫特4溶液:

class TappableNavigationBar: UINavigationBar { 
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
     isUserInteractionEnabled = self.point(inside: point, with: event) 
     return super.hitTest(point, with: event) 
    } 

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
     var extendedRect = frame 
     extendedRect.size.height += 300.0 - frame.origin.y 
     return extendedRect.contains(point) 
    } 
}