2012-07-25 67 views
1

这里是我的视图层次结构:parentView(UIView)有一个UIImageView作为它的子视图,而子视图又有一个UIButton作为其子视图。UIButton在UIImageView的框架区域内从不响应

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。任何想法发生了什么?

+1

** back的代码是什么:**。你在那里放置了一个'NSLog'来看看它是否触发了? – WrightsCS 2012-07-25 14:54:52

+0

你可以尝试将按钮添加到'parentView'而不是'left'吗? – 2012-07-25 15:04:18

+0

@EricBrotto它已经在我的问题。我试图做到这一点,只要按钮不落在图像视图的框架区域,它就会工作。 – Bourne 2012-07-25 15:08:10

回答

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]; 

所以,如果你需要在运行时探测到superviews弄清楚什么是什么,你可以在下面使用此代码。 [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 
+0

如果您阅读代码和问题的最后部分,他已启用它。 **'left.userInteractionEnabled = YES;'** – WrightsCS 2012-07-25 14:52:31

+0

嗯,是的,我跳到结论,并没有看到那一行:-(。它只是很常见。无论如何,父视图有userInteractionEnabled?我从来没有添加一个按钮到一个imageView,但我已经添加了一个手势识别器 – 2012-07-25 14:57:36

+0

我已经正确设置了另一种方法框架,我用它来设置屏幕中所有视图的框架,所以它也出现在适当的框架上 – Bourne 2012-07-25 15:16:29

-1
left.userInteractionEnabled = YES; 

,就把这行到底。

0

也许

parentView.userInteractionEnabled = YES; 

或父视图帧是小和不能老是保持按钮或图像视图。检查父视图的大小;

+1

parentView是一个'UIView',所以会默认设置,也似乎按钮工作时不与'UIImageVi重叠ew'。 – Autonomy 2012-07-25 15:13:30

0

我以前曾经遇到过这种情况..我认为这是吞噬事件的超级视角。

我知道你已经说过,将它添加到父视图只适用于它不与图像视图重叠。如果您在图像视图中禁用用户交互,那么按钮事件在添加到父视图时是否始终如一地触发?

+0

试过了。不起作用。 – Bourne 2012-07-25 15:22:29

+0

它与imageview完全删除? – Autonomy 2012-07-25 15:31:39

+0

是的。它可以在移除imageView的情况下工作。它只在UIView-> UIImageView-> UIButton层次结构中不起作用。不管UIButton是否是UIImageView或UIView的子视图。 – Bourne 2012-07-25 15:32:43

0

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

摘自here

+0

啊..不起作用。我在适当的层次结构中添加视图。我甚至尝试设置zPositions以正确使用视图的图层。即使那样也行不通。 – Bourne 2012-07-25 15:41:48