我正在尝试在 swift 4 的函数中为动态创建的 UILabel 添加点击手势,但它没有触发 UITapGestureRecognizer 函数。当我从 viewDidLoad 函数添加点击手势时它正在工作,但我必须从其他函数添加点击手势。
这里是代码
override func viewDidLoad() {
super.viewDidLoad()
createLabel()
}
func createLabel() {
let label = UILabel()
label.text = "abc"
label.numberOfLines = 0
label.frame.size.width = self.otherlinksStack.bounds.width
label.font = label.font.withSize(17) // my UIFont extension
label.sizeToFit()
label.tag = 1
self.otherlinksStack.addSubview(label)
let labelTapGesture = UITapGestureRecognizer(target:self,action:#selector(self.doSomethingOnTap))
label.isUserInteractionEnabled = true
label.addGestureRecognizer(labelTapGesture)
}
@objc func doSomethingOnTap() {
print("tapped")
}
最佳答案
你做错了几件事......
// your code
label.frame.size.width = self.otherlinksStack.bounds.width
label.sizeToFit()
如果您要将标签添加到 stackView,则无需设置其框架——让 stack view 处理它。如果您的 stackView 的对齐方式设置为 .fill
,它无论如何都会将标签拉伸(stretch)到它的宽度。如果它未设置为填充,标签将根据其文本按需要水平扩展。因此,也无需调用 .sizeToFit()
。
// your code
self.otherlinksStack.addSubview(label)
将 View 添加到堆栈 View 时,使用.addArrangedSubview
,否则它将被添加到堆栈 View 中另一个 View 的顶部。
这应该可以正常工作(在我的快速测试中确实如此):
func createLabel() {
let label = UILabel()
label.text = "abc"
label.numberOfLines = 0
label.font = label.font.withSize(17) // my UIFont extension
label.tag = 1
// give the label a background color so we can see it
label.backgroundColor = .cyan
// enable user interaction on the label
label.isUserInteractionEnabled = true
// add the label as an Arranged Subview to the stack view
self.otherlinksStack.addArrangedSubview(label)
// create the gesture recognizer
let labelTapGesture = UITapGestureRecognizer(target:self,action:#selector(self.doSomethingOnTap))
// add it to the label
label.addGestureRecognizer(labelTapGesture)
}
@objc func doSomethingOnTap() {
print("tapped")
}
关于ios - 以编程方式将点击手势添加到 UILabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54690219/