提问者:小点点

当标签大小增加时,增加UILabel上UITapGestureRecognizer的抽头区域


我在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
        }
    }
}

我该怎么做呢?


共1个答案

匿名用户

轻击手势识别器附加到视图,并对视图框架内的轻击作出响应。它没有自己的抽头区。如果您增加了标签的大小,那么抽头区域的大小也应该增加。

我记得读过苹果公司的一篇推荐文章,说可抽头的区域至少是40x40点。您可能希望将一个不可见视图(称为TapView)放置在标签顶部,该视图略大于标签(您可以获得标签的框架,并调用CGRECT.INSET(By:)并将所有边缘的值为负值。将得到的矩形用作TapView的框架,并在标签顶部添加tap视图。)如果您这样做了,那么您应该在视图控制器的ViewDidLayoutSubViews()方法中放置代码(以及任何更改NameLabel标签的时候),以调整“Tap view”的框架。