首页 > 解决方案 > StackView 内的 UILabel 的 UITapGestureRecognizer

问题描述

我有一个带有两个标签的堆栈视图,其中一个标签一旦被点击,假设会导致另一个视图。

这里是我的 UIView 子类的代码,其中设置了标签和 StackView:

    import UIKit
    import SnapKit

class WelcomeView: UIView {

weak var coordinator: MainCoordinator?

private let imageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = UIImage(named: "backGroundImage")
    imageView.contentMode = .scaleAspectFill
    imageView.layer.masksToBounds = true

    return imageView
}()

private let questionLabel: UILabel = {
    let questionLabel = UILabel()
    questionLabel.text = "Don't have an Account?"
    questionLabel.font = UIFont(name: "Avenir Next Regular", size: 17)
    questionLabel.textColor = .black

    return questionLabel
}()

private let signUpLabel: UILabel = {
    let signUpLabel = UILabel()

    let tap = UITapGestureRecognizer(target: self, action: #selector(ViewController.signUpTapped(tapGesture:)))

    signUpLabel.text = "Sign Up"
    signUpLabel.font = UIFont(name: "Avenir Next Regular", size: 17)
    signUpLabel.textColor = .black
    signUpLabel.highlightedTextColor = .link
    signUpLabel.isHighlighted = true

    signUpLabel.isUserInteractionEnabled = true
    signUpLabel.addGestureRecognizer(tap)

    return signUpLabel
}()

lazy var signUpstackView: UIStackView = {
    let stackView = UIStackView(arrangedSubviews: [questionLabel, signUpLabel])

    stackView.axis = .horizontal        
    stackView.alignment = .fill
    stackView.distribution = .fill
    stackView.spacing = 8
    stackView.isUserInteractionEnabled = true

    return stackView
}()

override init(frame: CGRect) {

    super.init(frame: frame)
    addSubViews()

}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    addSubViews()

}    

func addSubViews() {

    self.backgroundColor = .white
    self.addSubview(imageView)
    self.addSubview(btnSignIn)
    self.addSubview(signUpstackView)
    setConstraints()

}

func setConstraints() {
    imageView.snp.makeConstraints { (make) in
        make.edges.equalToSuperview()
    }

    btnSignIn.snp.makeConstraints { (make) in

        make.height.equalTo(60)
        make.bottomMargin.equalTo(-50)
        make.leftMargin.equalTo(28)
        make.rightMargin.equalTo(-28)
    }

    signUpstackView.snp.makeConstraints { (make) in
        make.height.equalTo(24)
        make.centerX.equalTo(self)
        make.top.equalTo(btnSignIn).offset(70)
    }
}
}

我在 signUpLabel 中添加了UITapGestureRecognizer

这是来自我的 ViewController 的代码,其中包含我在 UITapGestureRecognizer 中指定的 IBAction 函数 signUpTapped

class ViewController: UIViewController {

var welcomeView = WelcomeView()

override func loadView() {
    view = welcomeView

}

override func viewDidLoad() {
    super.viewDidLoad()
}

    @IBAction func signUpTapped(tapGesture:UITapGestureRecognizer) {
        print("Tapped")
    }

}

出于某种原因,当我尝试单击我的注册标签时没有任何反应。这是一个问题,因为我的 UILabel 在 StackView 内吗?

标签: swiftautolayout

解决方案


你需要

溶胶一

let tap = UITapGestureRecognizer(target: self, action: #selector(self.signUpTapped(tapGesture:)))

然后在视图类中

 weak var delegate:ViewController?

  @objc func signUpTapped(tapGesture:UITapGestureRecognizer) {
    print("Tapped")
    delegate?.tapped()
}

var welcomeView = WelcomeView()

override func loadView() {
   welcomeView.delegate = self
   view = welcomeView 
}
func tapped(){}

溶胶 2

weak var delegate:ViewController?
init(frame: CGRect,delegate:ViewController) { 
  super.init(frame: frame)
  self.delegate = delegate
  addSubViews() 
}

let tap = delegate(target:delegate!, action: #selector(delegate!.signUpTapped(tapGesture:)))

在vc里面

@objc func signUpTapped(tapGesture:UITapGestureRecognizer) {
    print("Tapped")
}

推荐阅读