当标签大小增加时,增加 UILabel 上 UITapGestureRecognizer 的点击区域
Increase tap area for UITapGestureRecognizer on UILabel when size of the label increases
我在 UICollectionViewCell 上有一个 UILabel。在 UILabel 上,我附加了一个 UITapGestureRecognizer。当 UILabel 的宽度增加时,我试图增加 UILabel 上 UITapGestureRecognizer 的点击区域。
这是代码示例:
class BusCell: UICollectionViewCell {
var bus: Bus!
var tapGesture: UITapGestureRecognizer!
@IBOutlet weak var nameLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
addTapGestureToNameLabel()
}
// MARK: - UI
func addTapGestureToNameLabel() {
tapGesture = UITapGestureRecognizer(target: self, action: #selector(nameLabelDoubleTap(gesture:)))
tapGesture.numberOfTapsRequired = 2
nameLabel.addGestureRecognizer(tapGesture)
nameLabel.isUserInteractionEnabled = true
}
func configure(_ bus: Bus, isStereo: Bool = false) {
self.bus = bus
loadCellUI(bus: bus)
bus.updateBlock = { [weak self] in
guard let strongSelf = self else {
return
}
strongSelf.loadCellUI(bus: bus)
}
}
func loadCellUI(bus: Bus) {
nameLabel.frame = CGRect(x: CGFloat(0), y: yPosition, width: 122, height: self.nameLabel.frame.height)
if bus.isStereo {
if bus.index % 2 == 0 {
let frame = nameLabel.frame
nameLabel.frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: 244, height: frame.height)
nameLabel.isHidden = false
// Make the tap frame same as the nameLabel's frame
} else {
nameLabel.isHidden = true
}
} else {
let frame = nameLabel.frame
nameLabel.frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: 122, height: frame.height)
nameLabel.isHidden = false
// Make the tap frame same as the nameLabel's frame
}
}
}
如何进行这项工作?
点击手势识别器附加到视图,并响应视图框架内的点击。它没有自己的点击区域。如果增加标签的大小,则点击区域的大小也应增加。
我记得读过 Apple 的建议,可点击区域至少为 40x40 点。您可能想在标签顶部放置一个不可见的视图(称为 tapView
),它比标签稍大(您可以获得标签的框架,并调用 CGRect.inset(by:)
所有的负值边缘。使用生成的矩形作为 tapView
的框架,并在标签顶部添加点击视图。)如果你这样做,那么你应该将代码放入视图控制器的 viewDidLayoutSubviews()
方法(和任何时候您更改 nameLabel
标签)以调整 tapView
的框架。
我在 UICollectionViewCell 上有一个 UILabel。在 UILabel 上,我附加了一个 UITapGestureRecognizer。当 UILabel 的宽度增加时,我试图增加 UILabel 上 UITapGestureRecognizer 的点击区域。
这是代码示例:
class BusCell: UICollectionViewCell {
var bus: Bus!
var tapGesture: UITapGestureRecognizer!
@IBOutlet weak var nameLabel: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
addTapGestureToNameLabel()
}
// MARK: - UI
func addTapGestureToNameLabel() {
tapGesture = UITapGestureRecognizer(target: self, action: #selector(nameLabelDoubleTap(gesture:)))
tapGesture.numberOfTapsRequired = 2
nameLabel.addGestureRecognizer(tapGesture)
nameLabel.isUserInteractionEnabled = true
}
func configure(_ bus: Bus, isStereo: Bool = false) {
self.bus = bus
loadCellUI(bus: bus)
bus.updateBlock = { [weak self] in
guard let strongSelf = self else {
return
}
strongSelf.loadCellUI(bus: bus)
}
}
func loadCellUI(bus: Bus) {
nameLabel.frame = CGRect(x: CGFloat(0), y: yPosition, width: 122, height: self.nameLabel.frame.height)
if bus.isStereo {
if bus.index % 2 == 0 {
let frame = nameLabel.frame
nameLabel.frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: 244, height: frame.height)
nameLabel.isHidden = false
// Make the tap frame same as the nameLabel's frame
} else {
nameLabel.isHidden = true
}
} else {
let frame = nameLabel.frame
nameLabel.frame = CGRect(x: frame.origin.x, y: frame.origin.y, width: 122, height: frame.height)
nameLabel.isHidden = false
// Make the tap frame same as the nameLabel's frame
}
}
}
如何进行这项工作?
点击手势识别器附加到视图,并响应视图框架内的点击。它没有自己的点击区域。如果增加标签的大小,则点击区域的大小也应增加。
我记得读过 Apple 的建议,可点击区域至少为 40x40 点。您可能想在标签顶部放置一个不可见的视图(称为 tapView
),它比标签稍大(您可以获得标签的框架,并调用 CGRect.inset(by:)
所有的负值边缘。使用生成的矩形作为 tapView
的框架,并在标签顶部添加点击视图。)如果你这样做,那么你应该将代码放入视图控制器的 viewDidLayoutSubviews()
方法(和任何时候您更改 nameLabel
标签)以调整 tapView
的框架。