ios - Swift:UIScrollView 和 UIControl - 添加目标 | addGestureRecognizer - 未按预期工作

标签 ios swift uiscrollview swift5 uicontrol

我正在使用 UIScrollViewUIStackView 水平滚动并选择一个 UIControl 元素。

我在 UIStackView 中的 UIControl 元素上设置了 addTarget,如下所示:
HighlightColorView 的类型是 UIControl

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 时,点击不会按预期工作。似乎有一个卡住,它只在 View 被关闭时才有效。
基本上,你点击一种颜色,然后当你关闭 View 时什么也没有发生,然后点击注册并开始工作。 这似乎是 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 则它不会工作。

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

回答你提出的问题

UIGestureRecognizer 将与单个 View 一起使用。 @TomSwift 的回答。
我认为这适用于您使用多个 View 的情况。将 addTargetaddGestureRecognizer 设置为仅一个 View 。

如果您使用多个 View ,例如您在 UIStackView 中有一个 UIControl 并且在 中有一个 UIStackView >UIScrollView 您需要确保 addTargetaddGestureRecognizer 仅设置为 views 之一。

由于您希望 UIControl 响应点击,您需要仅在此 View 上设置 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 函数中,放在那里就可以了。只需从您的 View 中删除额外的 addTargetaddGestureRecognizer

关于ios - Swift:UIScrollView 和 UIControl - 添加目标 | addGestureRecognizer - 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59442875/

相关文章:

objective-c - 添加推送通知时的 Bundle ID 问题

ios - 如果 reverseGeocodeLocation 返回一个位置标记数组,该如何处理?

ios - 如何获取用于 SSL 固定的公钥哈希?

ios - Swift 错误 : cannot invoke `dataWithRequest` with an argument list of type `(NSURL, completionHandler :(_, _,_) -> Void

iPhone - UIView 内的 UIScrollView 不滚动

ios - 自动布局错误 Unable to simultaneously satisfy constraints with UIScrollView

ios - 为什么不调用 UITableViewCell cellForRowAt 方法?

ios - UICollectionView 和 UIView 变成 UIScrollView

ios - 在 64 种不同的可用概率中切换的最佳方式是什么

iphone - 在不触发 touchesCancelled 的情况下滚动 UIScrollView