2012-10-19 27 views
0

我確實有一個UIView子類,我們稱之爲PopupView。在這個PopupView裏面我有一個NavigationBar,裏面有一個自定義的uiview和一個uibutton (2)。在PopupView中還有一個UIButton (1)uiviews按鈕框架調整大小後禁用用戶操作

PopupView 
    - UIButton (1) 
    - UINavigationBar 
    - UINavigationItem 
     - UIBarButtonItem 
     - UIView 
      - UIButton (2) 

這UIButton的在UINavigationBar的crazyness的原因是因爲我可以用backgroundimages capinsets在一個UIButton,但不是一的UIBarButtonItem。

我的問題:

我調整使用PopupView的UIView動畫和動畫完成後,我無法點擊的按鈕本的UIView了

[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationCurveEaseOut animations:^{ 
     CGRect popupFrame = self.frame; 
     popupFrame.size.height += 140.0f; 
     popupFrame.origin.y = floorf(popupFrame.origin.y - (140.0f/2)); 
     self.frame = popupFrame; 
    } completion:^(BOOL finished) { 
}]; 

如果我不使用uiview動畫並直接設置新框架,也會發生這種情況。也不要緊,如果我調整它的點擊或直接在它的viewController viewDidLoad

任何想法,爲什麼會發生這種情況?

+1

運行您的應用程序並將其置於按鈕不響應的狀態。然後在調試器中暫停並運行以下命令:'po [[UIApp keyWindow] recursiveDescription]'。複製輸出並將其粘貼到您的帖子中。 –

+0

嘿搶,見https://gist.github.com/d9f7bb875be6590b315a。我在說的PopupView在GIST底部附近被稱爲'MoviePopupView'。 – choise

回答

4

希爾是你的recursiveDescription輸出的相關部分:

| | <UIView: 0xaac0480; frame = (0 0; 320 568); tag = 23945; layer = <CALayer: 0xaac04e0>> 
| | | <MJPopupBackgroundView: 0xaac0710; frame = (0 0; 320 568); tag = 23943; layer = <CALayer: 0xaac07c0>> 
| | | <UIButton: 0xaac0aa0; frame = (0 0; 320 568); opaque = NO; layer = <CALayer: 0xaac0b60>> 
| | | <UIView: 0x9d6fea0; frame = (10 204; 300 160); autoresize = W+H; tag = 23942; layer = <CALayer: 0x9d6ff50>> 
| | | | <MoviePopupView: 0xab1aaa0; frame = (0 -70; 300 300); clipsToBounds = YES; layer = <CALayer: 0xab1a070>> 

的0xaac視圖覆蓋屏幕。

在0xaac視圖內,0x9d6視圖的高度爲160點,並在0xaac視圖內垂直居中。

在0x9d6視圖內部,0xab1 MoviePopupView的高度爲300點,並且(Y的原點爲-70)位於0x9d6視圖的「內部」中央,但是溢出了0x9d6視圖的頂部和底部邊緣。

clipsToBounds屬性的默認值爲NO,因此0x9d6視圖不會在視覺上剪切其0xab1子視圖的內容。因此這些按鈕在屏幕上仍然可見。

但是,命中測試總是剪切到視圖的邊界。所以當你試圖觸摸其中一個按鈕時,命中不在0x9d6視圖的範圍內(它只有160點的高度)。 0x9d6視圖在到達MoviePopupView或其下的按鈕之前拒絕該觸摸。

這在hitTest:withEvent: documentation中提到:

點擺在外面打,即使他們實際上在於接收器的子視圖中的一個內接收器的界限從未報告。如果當前視圖的clipsToBounds屬性設置爲NO,並且受影響的子視圖超出視圖的界限,則會發生這種情況。

+0

釘了它。非常感謝。需要更多地使用'recursiveDescription'。想看看模擬器的webkit督察督察:) – choise

+0

甜!陷入了類似的情況。視圖寬度和高度設置得比需要的小,但視圖完全可見。將'clipsToBounds'設置爲'YES'後,我意識到幀值是離開的。謝謝 ! – GoodSp33d

0

因爲我們沒有看到按鈕的位置,所以無法確定,但如果您爲包含按鈕的UIView提供背景顏色(或將其設置爲剪輯子視圖),則可能會發現調整大小會導致您的按鈕位於框架之外,從而使它們不可點擊。

+0

我可以看到他們,我只是不能點擊他們 – choise

+0

啊,現在我明白了。似乎在視圖內部,裁剪不會改變任何東西,仍然存在。 – choise

+0

是的,但是如果您的視圖未設置爲剪輯子視圖,即使它們位於框架之外,也可以看到它們。 –