swift - 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 内吗?
解决方案
你需要
溶胶一
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")
}
推荐阅读
- angular - 设置默认值以使用反应形式进行选择
- json - 将 SQL 查询的结果与来自 Invoke-RestMethod 的 JSON 结果匹配
- rest - 如果我的 API 已经按照 HAL 规范返回自链接,我应该为创建的资源使用位置标头吗?
- xaml - UWP 拇指样式相同但外观不同
- android - Android 构建错误:原因:java.lang.NoSuchMethodError: com.google.common.util.concurrent.Futures.addCallback
- python - 导入错误:张量板
- laravel - laravel eloquent:获取成员的所有组
- keystonejs - 使用 Mongo 和 Keystone JS 存储对象数组的字段类型
- serverless-framework - 从已部署的无服务器端点中提取域
- r - 按国家/地区创建每页的人员序列