StackView内部用于UILabel的UITapGestureRecognizer

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

我有一个带有两个标签的堆栈视图,其中一个曾经被点击,可能会导致另一个视图。

这里是我的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的代码,其中包含IBAction函数signUpTapped,该函数在UITapGestureRecognizer中指定:

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中吗?

swift autolayout
1个回答
0
投票

您需要

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 
}
© www.soinside.com 2019 - 2024. All rights reserved.