回答

2

子視圖的可觸摸性通常不會超出超視圖的界限。因此,您需要爲集合視圖單元類進行命中測試,以便即使觸摸位於單元格邊界之外,其子視圖也可以觸摸。

在我的書中,我舉一個example(你可以下載並試用你的機器上),其工作原理是這樣:

override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
    if let result = super.hitTest(point, withEvent:event) { 
     return result 
    } 
    for sub in self.subviews.reverse() as [UIView] { 
     let pt = self.convertPoint(point, toView:sub) 
     if let result = sub.hitTest(pt, withEvent:event) { 
      return result 
     } 
    } 
    return nil 
} 

您可能需要適應的是有點,但是,因爲它可能是該標籤不是該單元的直接子視圖(如該示例代碼中所假定的)。但是,它確實顯示了這個想法。

+0

有關這裏涉及的理論和實踐,請參閱我的書的早期版本:http://www.apeth.com/iOSBook/ch18.html#_hit_testing – matt 2015-04-04 21:59:42

0

一種方式是繼承UICollectionViewCell,並覆蓋pointInside(_:withEvent:)返回true如果該點是細胞的標籤內:

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
    let pointInLabelCoords = convertPoint(point, toView: label) 
    if label.pointInside(pointInLabelCoords, withEvent: event) { 
     return true 
    } 
    return super.pointInside(point, withEvent: event) 
} 

或者,如果你需要一個更強大的解決方案,可用於在任何OUT-觸摸只要列舉contentView.subviews並詢問每個視圖是否在該點內。

請記住,只有當單元格(包括其可觸摸的超出邊界子視圖)完全包含在單元格的超視圖中時,此方法纔有效。這是因爲當系統查找視圖以響應觸摸時(見hitTest(_:withEvent:)),視圖層次被遍歷。如果可觸摸區域位於單元格的超視圖範圍之外,則還需要覆蓋上的pointInside(_:withEvent:),即視圖(集合視圖)。

相關問題