答案 0 :(得分:2)
我正在阅读你的问题的方式,你想拦截事件来触发一些动作(动画工具栏,发布通知),同时允许事件也到达其自然目的地。
如果我尝试这样做,我会将UIToolbar
直接作为UIViewController.view
的子视图。 UIWebView
也是一个直接的子视图。
UIViewController.view
应该是UIView
的子类,并且需要覆盖
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
通过发回您想要接收事件的视图(UIToolbar或UIWebView),视图可以侧面成为事件处理的一部分,同时您仍有机会触发所需的操作。
一个例子可能是:
- (UIView *)hitTest:(CGPoint) point withEvent:(UIEvent *)event {
UIView* subview = [super hitTest:point withEvent:event];
/* Use the event.type, subview to decide what actions to perform */
// Optionally nominate a default event recipient if your view is not completely covered by subviews
if (subview == self) return self.webViewOutlet;
return subview;
}
答案 1 :(得分:1)
如果您首先将UIView子类添加到视图控制器的视图中,然后按照您的描述添加UIWebView,UIWebView将完全覆盖UIView子类(假设两个视图完全重叠,如您在问题评论中提到的那样)
听起来你不想要那个 - 你想要上面的子类 web视图。您需要以相反的顺序将它们添加到视图控制器的视图中(添加Web视图,然后添加自定义UIView)或调用:
[viewContoller.view insertSubview:webView belowSubview:subclass];
有了这个,我们来谈谈如何拦截触摸事件。我将建议一种不同的方法,让我做一些类似的事情。 Here's the question and answer I created for it - 随时可以查看有关此技术的详细信息。
这个想法是你继承UIApplication并覆盖-sendEvent:方法。我想你的看起来像这样:
- (void)sendEvent:(UIEvent *)event {
[super sendEvent:event];
NSSet *allTouches = [event allTouches];
if ([allTouches count] > 0) {
UITouch *touch = [allTouches anyObject];
if ([allTouches count] == 1 && touch.phase == UITouchPhaseEnded && touch.tapCount == 1) {
// Do something here
}
}
}
我不认为这会让你100%在那里,但希望这是一个开始。特别是,您可能想要使用if条件来检查您正在处理的UITouches的属性。我不确定我是否包括正确的支票,或者他们是否能抓住你正在寻找的确切条件。
祝你好运!答案 2 :(得分:1)
好的,这个怎么样:
- 在自定义UIView
子类中,添加指向UIWebView
- 将ivar添加到UIView
子类BOOL hasMoved;
- 在UIView
子类中,覆盖这样的触摸方法:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
hasMoved = NO;
[webView touchesBegan:touches withEvent:event];
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
hasMoved = YES;
[webView touchesMoved:touches withEvent:event];
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if(!hasMoved) [self hideToolbar];
[webView touchesEnded:touches withEvent:event];
}
然后将自定义视图放在Web视图的顶部。看起来太简单了,可能是 - 可能需要一些魔术来正确处理多个触摸,你可能需要在NSTimer
方法中使用touchesBegan:
作为延迟来处理双击情况,但我认为一般的想法是合理的......也许?
答案 3 :(得分:1)
取2:与上面相同,但重写方法如下:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
hasMoved = NO;
[[[webView subviews] objectAtIndex:0] touchesBegan:touches withEvent:event];
}
-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
hasMoved = YES;
[[[webView subviews] objectAtIndex:0] touchesMoved:touches withEvent:event];
}
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if(!hasMoved) [self toggleToolbar];
[[[webView subviews] objectAtIndex:0] touchesEnded:touches withEvent:event];
}
-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
[[[webView subviews] objectAtIndex:0] touchesCancelled:touches withEvent:event];
}
这有点......这允许您拖动Web视图。但它没有正确处理其他触摸事件(链接,捏,任何东西)。所以。可能不是很有用,但这对我来说很有意义!