簡體   English   中英

按位置(CGPoint)識別 UIView 中的子視圖

[英]Identify Subview in UIView by Location (CGPoint)

我正在嘗試找出在UIView中的給定CGPoint處找到確切子視圖(如果有)的最佳方法。

我的場景/ViewController 的一部分是自定義UIView子類(在 XIB 中設計),它呈現子視圖的UIStackView (也是自定義的,XIB 設計的)。

VC 在該自定義視圖上有一個UITapGestureRecognizer ,在我的@IBAction ,我想確定它的哪個特定子視圖被點擊,然后相應地處理它:

@IBAction func handleTap(recognizer:UITapGestureRecognizer) {

    let tapLocation = recognizer.location(in: recognizer.view)
    if let subviewTapped = customView.subviewAtLocation(tapLocation) {
        handleTapForSubview(subviewTapped)
    }
}

但是,我不知道如何實現subviewAtLocation(CGPoint)方法。 我無法在標准 UIView 方法中找到任何內容。

歡迎任何有關如何完成的建議。

或者,我考慮為每個子視圖添加一個點擊識別器,然后委托給父視圖,然后委托給 VC,但這感覺效率低下,就像它在視圖中放置了太多控制邏輯,而不是 VC。

謝謝你。

一個解決方案是使用CGRectcontains(point:)方法。 這個想法是迭代堆棧視圖的子視圖並檢查哪些子視圖包含觸摸點。 這里:

@IBAction func handleTap(recognizer:UITapGestureRecognizer) {
    let tapLocation = recognizer.location(in: recognizer.view)
    let filteredSubviews = stackView.subviews.filter { subView -> Bool in
      return subView.frame.contains(tapLocation)
    }

    guard let subviewTapped = filteredSubviews.first else {
      // No subview touched
      return
    }

    // process subviewTapped however you want
}

//使用hitTest()方法。 這給出了包含點的視圖

let subView = parentView.hitTest(point, with: nil)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM