UIImageView子类没有将触摸传递给控制器​​子视图

时间:2010-07-26 20:40:59

标签: objective-c uiviewcontroller uiimageview uibutton touches

当我在几个UIImageView子类实例后面添加UIButton子类(全屏)时,这些按钮停止接收触摸并且不再起作用。我没有尝试过任何恢复与用户接触的连接。

我试过了:
a)使用UIImageView子类作为前视图(接收触摸)并确保setUserInteractionEnabled为YES。结果:当UIButtons存在时,UIView没有响应。

b)明确地将前视图中的触摸传递给视图控制器,希望它能做正确的事情。结果:UIButtons未对触摸做出响应。

c)当收到前面touchesBegan上的任何触摸时,直接在我要与之交互的按钮上调用touchesMovedtouchesEndedUIView方法。结果:引人注目的是,即使我将触摸事件塞进他们的喉咙,按钮也没有响应。

d)将前视图中的触摸传递给UIViewController,并迭代所有子视图,手动分发触摸。我添加了touchesBegan方法,展示了我是如何尝试这样做的。执行时循环是无限的,它永远不会超过第一个视图(类型为FrameUIView)。

我知道这个问题很可能是因为我对正确的视图层次结构或响应者链缺乏了解。

如果我评论按钮后创建的最后一个视图,则按钮工作正常。在这方面UIButtons有什么特别之处吗?

这是代码。

我有一个UIViewController子类:

    - (void)loadView {

        mainAppView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
        self.view = mainAppView;

        frameImageView = [[FrameUIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        frameImageView.image = [UIImage imageNamed:[[[ThemeController sharedInstance] currentTheme] frameImageFilename]];
        [frameImageView setUserInteractionEnabled:YES];
        [mainAppView addSubview:frameImageView];

        zoomInButton = [[CustomUIButton alloc] initWithFrame:CGRectMake(controlsOriginX + zoomWidth + lightWidth, controlsOriginY, zoomWidth, controlsHeight)];
    [zoomInButton setTitle:@"+" forState:UIControlStateNormal];
    [[zoomInButton titleLabel] setFont:[UIFont systemFontOfSize:28]];
    [zoomInButton addTarget:self action:@selector(doMyAction) forControlEvents:UIControlEventTouchDown];
    [zoomInButton addTarget:self action:@selector(cancelMyAction) forControlEvents:UIControlEventTouchUpInside];
    [mainAppView addSubview:zoomInButton];


        FrameFrontUIView *frameFrontImageView = [[FrameFrontUIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        frameFrontImageView.image = [UIImage imageNamed:[[[ThemeController sharedInstance] currentTheme] frameFrontImageFilename]];
        [frameFrontImageView setUserInteractionEnabled:YES];
    [mainAppView addSubview:frameFrontImageView];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UIView *view in self.view.subviews) {
        NSLog(@"view is a %@", [view description]);
        [view touchesBegan:touches withEvent:event];
    }
}

任何有关如何做到这一点的提示的人都会赢得互联网和cookie。也接受俄罗斯轮盘赌混乱的左轮手枪。谢谢。

2 个答案:

答案 0 :(得分:0)

您是否尝试使用没有图像视图的按钮?不建议对UIButton进行子类化。实例化UIButtons的方法是使用工厂方法:

UIButton* myButton = [UIButton buttonWithType:UIButtonTypeCustom];

所以我的猜测是你创建的CustomUIButton个实例没有正确设置。

答案 1 :(得分:0)

这个问题很老,但我遇到了同样的问题。

我使用的解决方案是创建一个容器UIView,然后将UIImageView添加为子视图,然后添加按钮,文本框等。似乎运作良好。

我真的不明白为什么这是使用UIImageView作为按钮的超级视图的问题。