簡體   English   中英

Swift: UIScrollView & UIControl - addTarget | addGestureRecognizer - 未按預期工作

[英]Swift: UIScrollView & UIControl - addTarget | addGestureRecognizer - Not working as expected

我正在使用UIScrollViewUIStackView來水平滾動並選擇一個UIControl元素。

我在UIStackView內的UIControl元素上設置了UIStackView ,如下所示:
HighlightColorViewUIControl類型

lazy var colorsStackView: UIStackView = {
        let stackView = UIStackView()
        stackView.axis = .horizontal
        stackView.distribution = .fillEqually
        stackView.isUserInteractionEnabled = true
        stackView.alignment = .center
        stackView.spacing = 12
        stackView.translatesAutoresizingMaskIntoConstraints = false
        stackView.isUserInteractionEnabled = true
        for color in colors {
            let colorView = HighlightColorView()
            colorView.backgroundColor = color
            colorView.addTarget(self, action: #selector(self.handleColorTap(_:)), for: .touchUpInside)
            stackView.addArrangedSubview(colorView)
        }
        return stackView
    }()

@objc func handleColorTap(_ sender: UIView) {
        highlightSelectionDelegate.didTapColor(colorView: sender, mainView: self)
        let viewBackgroundColor = sender.backgroundColor ?? .black
        print("🎯", viewBackgroundColor)
    }

問題是當您點擊UIControl類型的colorView ,點擊無法按預期工作。 似乎有一個凍結,它只在視圖被關閉時才有效。
基本上你點擊一種顏色,然后當你關閉視圖時沒有任何反應,然后點擊注冊並開始工作。 這似乎是 scrollView 的問題,但我不確定。

scrollView實現:

lazy var scrollView: UIScrollView = {
        let scView = UIScrollView()
        scView.contentInset = UIEdgeInsets(top: 0, left: 12, bottom: 0, right: 12)
        scView.showsHorizontalScrollIndicator = false
        scView.translatesAutoresizingMaskIntoConstraints = false
        scView.isUserInteractionEnabled = true
        scView.delaysContentTouches = false
        return scView
    }()

用例它能夠滾動顏色並點擊它們以突出顯示文本。

我注意到的一件事是您可能指的是UITapGestureRecognizer 如果您UIGestureRecognizer使用UIGestureRecognizer ,那么它將無法工作。

     let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleColorTap))
     view.addGestureRecognizer(tapRecognizer)

回答你提出的問題

UIGestureRecognizer將與單個視圖一起使用。 @TomSwift 的回答。
我認為這適用於您使用多個視圖的情況。 設置addTargetaddGestureRecognizer到僅一個視圖。

如果您正在使用多個視圖,如在你的情況,你有一個UIControl一個內部UIStackViewUIStackView一個內部UIScrollView你需要確保addTargetaddGestureRecognizer只設置的一個views而已。

既然你想UIControl向你需要設置一個水龍頭響應addTarget只有這種觀點,而不是在UIScrollView和/或UIStackView

for color in colors {
    let colorView = HighlightColorView()
    colorView.backgroundColor = color
    colorView.addTarget(self, action: #selector(handleColorTap(_:)), for: .touchUpInside)
    colorsStackView.addArrangedSubview(colorView)
  }

注意:您不必將代碼放在viewDidLoad函數中,放在那里就可以了。 只是刪除額外addTargetaddGestureRecognizer從你的觀點。

暫無
暫無

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

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