什么可以传递到(并显示所有)子视图?

时间:2009-12-06 19:55:58

标签: iphone uiview uiviewcontroller uiwebview uitoolbar

4 个答案:

答案 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视图。但它没有正确处理其他触摸事件(链接,捏,任何东西)。所以。可能不是很有用,但这对我来说很有意义!