我在UIView
下面有一个浮动UINavigationBar
标题。我已将它作为子视图插入索引0,因此我可以根据UITableView
的contentOffset将其设置为动画。
但是,因为它超出了UINavigationBar
的范围,所以在向UITapGestureRecognizer
添加UITableView
后,我无法在此视图中收到触摸事件。所有触摸事件都会转到它下面的UITableView
。
如果可以在导航栏的边界之外设置子视图并为其接收触摸事件,是否有任何想法?
我之所以这样做是因为将其添加为{{1}}的子视图,我必须在滚动的同时根据contentOffset设置Y原点,这也会使动画变得非常困难,因为Y原点在滚动,所以我无法知道将它设置为动画的位置。
它类似于Facebook应用中的标题,其中包含" Status"," Photo"和"签入"的按钮。
由于
答案 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)
}
}