1

这是我的视图层次结构: parentView (UIView) 有一个 UIImageView 作为它的子视图,而它又有一个 UIButton 作为它的子视图。

left = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"left.png"]];
left.userInteractionEnabled = YES;
[parentView addSubview:left];

back = [UIButton buttonWithType:UIButtonTypeCustom];
[back setImage:[UIImage imageNamed:@"Arrow-left.png"] forState:UIControlStateNormal];
[back addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside];
back.showsTouchWhenHighlighted = YES;
[left addSubview:back];

一切正常显示,但按钮不响应触摸。如果我将其框架从 UIImageView 的框架移到其他地方并将其设置为父视图(UIView)的子视图,它会做出响应。但事情就是这样。

即使我设置为 parentView 的子视图,如果它在 UIImageView 的框架区域内,按钮也不会响应。图像视图的 userInteractionEnabled 属性已设置为 YES。知道发生了什么吗?

4

5 回答 5

1

UIImageView 关闭 userInteraction - 打开它,按钮将起作用。

编辑:

因此,我几乎完全按照所写的方式使用了您的代码-一个红鲱鱼是您说一切看起来都很好。对我来说,自定义按钮的框架为 0,0,0,0,所以我什么也没看到。当我设置框架时,一切都很完美:

    UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom];
    UIImage *image = [UIImage imageNamed:@"46-truck.png"];
    assert(image);

    [back setImage:image forState:UIControlStateNormal];
    [back addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
    back.showsTouchWhenHighlighted = YES;
    back.frame = (CGRect){ {0,0}, image.size};

NSLog(@"FRAME: %@", NSStringFromCGRect(back.frame) );
    [imageView addSubview:back];

因此,如果您需要在运行时探测超级视图以找出是什么,您可以使用下面的代码。[UIView dumpSuperviews:back msg:@"Darn Bark Button"];

@interface UIView (Utilities_Private)

+ (void)appendView:(UIView *)v toStr:(NSMutableString *)str;

@end

@implementation UIView (Utilities_Private)

+ (void)appendView:(UIView *)a toStr:(NSMutableString *)str
{
    [str appendFormat:@"  %@: frame=%@ bounds=%@ layerFrame=%@ tag=%d userInteraction=%d alpha=%f hidden=%d\n", 
        NSStringFromClass([a class]),
        NSStringFromCGRect(a.frame),
        NSStringFromCGRect(a.bounds),
        NSStringFromCGRect(a.layer.frame),
        a.tag, 
        a.userInteractionEnabled,
        a.alpha,
        a.isHidden
        ];
}

@end

@implementation UIView (Utilities)

+ (void)dumpSuperviews:(UIView *)v msg:(NSString *)msg
{
    NSMutableString *str = [NSMutableString stringWithCapacity:256];

    while(v) {
        [self appendView:v toStr:str];
        v = v.superview;
    }
    [str appendString:@"\n"];

    NSLog(@"%@:\n%@", msg, str);
}

+ (void)dumpSubviews:(UIView *)v msg:(NSString *)msg
{
    NSMutableString *str = [NSMutableString stringWithCapacity:256];

    if(v) [self appendView:v toStr:str];
    for(UIView *a in v.subviews) {
        [self appendView:a toStr:str];
    }
    [str appendString:@"\n"];

    NSLog(@"%@:\n%@", msg, str);
}

@end
于 2012-07-25T14:29:34.230 回答
0

您实际上需要设置userInteractionEnabled = NO以允许触摸通过。

取自这里

于 2012-07-25T15:36:33.387 回答
0

我以前也发生过这种情况。我认为这是一个吞噬事件的超级观点。

我知道您已经说过将其添加到 parentView 仅在它不与图像视图重叠时才有效。如果禁用图像视图上的用户交互,按钮事件是否会在添加到父视图时一致触发?

于 2012-07-25T15:05:47.330 回答
0

也许

parentView.userInteractionEnabled = YES;

或父视图框架太小,无法按住按钮或图像视图。检查父视图的大小;

于 2012-07-25T15:05:10.677 回答
-1
left.userInteractionEnabled = YES;

把这条线放在最后。

于 2012-07-25T14:50:23.313 回答