【问题标题】:UITapGestureRecognizer for UILabel inside of a StackViewStackView 中用于 UILabel 的 UITapGestureRecognizer
【发布时间】:2020-02-22 14:03:50
【问题描述】:

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

这里是我的 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 内吗?

【问题讨论】:

    标签: swift autolayout


    【解决方案1】:

    你需要

    溶胶 1

    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")
    }
    

    【讨论】:

    • 不幸的是 Sol1 确实有帮助。实施后,当我尝试点击“注册”标签时仍然没有任何反应。当我尝试通过添加“delegate:ViewController”作为输入参数来修改 UIView 子类中的 override init() 方法时,由于弹出错误,我无法实现 Sol2。错误 - “初始化程序不会覆盖其超类中的指定初始化程序”。
    • 可能在 StackView 上实现的约束中存在某种问题?不知何故,当我点击“SignUp”标签时,我只是点击 StackView 边界而不是标签本身?而代码只是没有被触发?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    相关资源
    最近更新 更多