2012-07-25 69 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