在UINavigationBar下面浮动标题作为子视图 - 接收触摸?

时间:2014-09-26 17:17:02

标签: ios objective-c uiview uinavigationbar

我在UIView下面有一个浮动UINavigationBar标题。我已将它作为子视图插入索引0,因此我可以根据UITableView的contentOffset将其设置为动画。

但是,因为它超出了UINavigationBar的范围,所以在向UITapGestureRecognizer添加UITableView后,我无法在此视图中收到触摸事件。所有触摸事件都会转到它下面的UITableView

如果可以在导航栏的边界之外设置子视图并为其接收触摸事件,是否有任何想法?

我之所以这样做是因为将其添加为{{1}}的子视图,我必须在滚动的同时根据contentOffset设置Y原点,这也会使动画变得非常困难,因为Y原点在滚动,所以我无法知道将它设置为动画的位置。

它类似于Facebook应用中的标题,其中包含" Status"," Photo"和"签入"的按钮。

由于

4 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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
    }
}

答案 2 :(得分: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)并在此之后设置动画,以便它在下方滑动。

答案 3 :(得分:0)

Swift 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)
    }
}