4

我有一種強烈的感覺,這可能是蘋果公司需要修復的Xcode的一個錯誤。我有一個視圖控制器作爲根控制器嵌入在導航控制器中。視圖控制器有一個與頂部佈局指南垂直對齊的按鈕。視圖控制器的按鈕工作正常,所有可點擊區域正在工作。導航欄導航導致推送視圖控制器上的按鈕頂部區域不可點擊的項目

enter image description here

然而,如果我推相同或相似的視圖控制器上導航堆棧,它的按鈕不會完全可點擊。按鈕的頂部(大約10個像素左右)不再可點擊。如果我嘗試點擊按鈕的左上角,則會輕點導航欄上的後退按鈕,即使我明顯沒有點擊導航欄邊界。我認爲這是一個蘋果的錯誤,但我想知道是否有人知道修復。如果有人需要,這裏是link to the github project

+1

如果你可以有你的按鈕,多一點點的高度,它可能是標籤,或者你可以選項卡比標題下的 – Terence

+0

更低一點,我實際上試過這樣做。它並沒有完全奏效,因爲頂部仍然有幾個像素。 – DJSK

回答

5

這是iOS的默認行爲。許多UIView在iOS中具有此擴展觸摸功能。例如,UINavigationBar,UITabBar, UISecgmentedControl等。我相信這是爲了讓這些控件更容易接觸。

如果您仍想要覆蓋此默認行爲。您可以通過繼承UINavigationBar做到這一點,在子類中添加這個方法:

-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 

    if ([self pointInside:point withEvent:event]) { 
     self.userInteractionEnabled = YES; 
    } else { 
     self.userInteractionEnabled = NO; 
    } 

    return [super hitTest:point withEvent:event]; 
} 

合併請求您Github project而成。

+0

看起來不錯。謝謝! – DJSK

+0

這非常有幫助。謝謝。 –

1

這裏的的情況下,任何人的解決方案的迅速版本需要它:

class CustomNavBar: UINavigationBar { 

    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
    if pointInside(point, withEvent: event) { 
     userInteractionEnabled = true 
    } else { 
     userInteractionEnabled = false 
    } 

    return super.hitTest(point, withEvent: event) 
    } 
} 

斯威夫特3和更高:

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
    isUserInteractionEnabled = self.point(inside: point, with: event) 
    return super.hitTest(point, with: event) 
} 
相關問題