Swift:UIScrollView&UIControl-addTarget | addGestureRecognizer-无法正常工作

问题描述 投票:1回答:2

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

我在UIControl元素中设置了addTarget,如下所示:UIStackView中:即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)
    }

问题是,当您点击类型为colorViewUIControl时,该点击无法正常工作。似乎有冻结现象,并且仅在关闭视图时才起作用。基本上,您点击一种颜色,然后什么都没有发生,那么当您关闭视图时,该点击就会注册并开始工作。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
    }()

用例可以在颜色上滚动并点击它们以突出显示文本。

ios swift uiscrollview swift5 uicontrol
2个回答
1
投票

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

[如果使用多重视图,例如在UIControl内有UIStackView而在UIStackView内有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


0
投票

您是否使用UIViewController用颜色显示堆栈视图?如果是这样,请尝试在viewDidLoad功能中添加颜色控件,而不是UIStackView的初始化程序。假设您正确设置了滚动视图,并向其中添加了堆栈视图。

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

UIScrollViewUIStackView的属性isUserInteractionEnabled都默认设置为true,因此无需添加它们。

© www.soinside.com 2019 - 2024. All rights reserved.