当标签大小增加时,增加 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 的框架。