2012-11-28 73 views
0

我有這個方案,其工作正常(--> =「具有子視圖」):加入self.view時的UIButton沒有得到觸摸

ViewController.view --> imageView --> containerView --> UIButton 

正如預期的那樣,按鈕觸發關閉指定選擇器。
但是,如果我做了以下(由於幾個原因是可取的)按鈕停止接收觸摸

ViewController.view --> imageView 
ViewController.view --> containerView --> UIButton 
[self.view bringSubviewToFront:_containerView]; 

任何導致?

- UPDATE

響應請求,這裏是一些按鈕創建代碼:

// in viewDidLoad 

_controlsView = [[[NSBundle mainBundle] loadNibNamed:@"Controls" 
     owner:self options:nil] objectAtIndex:0]; 
_controlsView.frame = CGRectMake(0, 50, 
     _controlsView.bounds.size.width, _controlsView.bounds.size.height); 
[self.view addSubview:_controlsView]; 
// ... 
[_controlsView.superview bringSubviewToFront:_controlsView]; 

// in viewDidAppear 

if (!_demoButton) { 
    _demoButton = (UIButton*)[_controlsView viewWithTag:kDemoButtonTag]; 
    [_demoButton addTarget:self action:@selector(buttonPressed:) 
     forControlEvents:UIControlEventTouchUpInside]; 
    // configuration, color, font, layer, etc. all works well 
} 

最後,Controls.xib看起來是這樣的:

Screenshot in IB

+0

假設你已經嘗試在整個層次結構中設置「@property(nonatomic,getter = isUserInteractionEnabled)BOOL userInteractionEnabled」 –

+0

@Ōkami是的。所有'userInteractionEnabled'都被設置。否則,它的按鈕將無法正常工作,如果添加到圖像視圖,對不對? – Mundi

+0

@Mundi:你是否將按鈕添加到imageView? –

回答

1

Probably您的觀點統治你的button.try這個

[self.view bringSubviewToFront:<UIButton_INSTANCE>]; 
+0

對不起。該按鈕是容器視圖的子視圖。如前所述,當容器視圖添加到圖像視圖時,它可以很好地工作,這就排除了這種可能性。 – Mundi

+0

是的,這從你的問題是清楚的。這就是爲什麼我在我的回答中提到可能是這樣。你嘗試過一次嗎? –

+0

當然。在創建之後和'viewDidAppear'中。 – Mundi

0

有時候會發生這種情況,當我在容器視圖的框架外部設置一個控制元素時,發生在我身上。我沒有測試過這個,但是因爲你有很多嵌套的視圖,它可能會在第一個實例中出現,因爲imageview可能足夠大以包含UIButton。

+0

圖像視圖確實比容器視圖和按鈕大。但它應該**在容器視圖後面**。該按鈕當然在容器視圖內,所以也不能成爲原因。 – Mundi

+0

嗨,我只是重建你的結構,並不能複製這個問題。這一切都像你期待它的工作一樣。如果UIButton位於容器框架內,則會註冊觸摸。將容器添加爲imageView的子視圖沒有任何區別。如果您可以發佈視圖創建和添加代碼的子視圖,也許有些事我忽略了。 – Tim

+0

我用一些代碼更新了這個問題。 – Mundi

0

由於代碼不夠,無法準確找出發生這種情況的原因。

我想你應該嘗試寫的UIButton的類別覆蓋-touchesBegan:withEvent:-touchesMoved:withEvent:-touchesEnded:withEvent:與像一些調試信息輸出:

{ 
    [super touchesBegan:touches withEvent:event]; 
    NSLog(@"Touches began/moved/ended!"); 
} 

當你按下了UIButton的實例和調試信息被獲取印刷,即意味着你的UIButton的實例已經收到觸摸事件,但沒有以正確的方式處理它。而在相反的情況下,這意味着響應鏈中存在一個實例阻止事件傳遞。

特別是,如果發現只有觸摸開始調試信息打印並觸摸移動調試信息不​​再打印後,您的手指移動,您的觸摸事件可能被手勢識別器阻止。

+0

我試過'touchesBegan'方法。它只捕捉圖像視圖觸動。該按鈕沒有觸及。那麼,我們已經知道了。如上所述,當按鈕的容器作爲子視圖添加到圖像視圖時,該按鈕正確連接並按預期工作。 – Mundi