UITapGestureRecognizer для UILabel внутри StackView - PullRequest
1 голос
/ 22 февраля 2020

У меня есть Stack View с двумя метками, одна из которых однажды нажата, предположим, что это приведет к другому представлению.

Вот код моего подкласса 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)
    }
}
}

Я добавил UITapGestureRecognizer в signUpLabel .

А вот код из моего 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?

1 Ответ

0 голосов
/ 22 февраля 2020

Вам нужно

Sol 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(){}

Sol 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:)))

и внутри v c

@objc func signUpTapped(tapGesture:UITapGestureRecognizer) {
    print("Tapped")
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...