Увеличивайте область касания для UITapGestureRecognizer на UILabel при увеличении размера метки

У меня есть UILabel на UICollectionViewCell. К UILabel у меня прикреплен UITapGestureRecognizer. Я пытаюсь увеличить область касания UITapGestureRecognizer на UILabel, когда ширина UILabel увеличивается.

Вот пример кода:

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

Как мне заставить это работать?


person NataliaKh    schedule 24.03.2021    source источник


Ответы (1)


Распознаватель жестов прикосновения прикрепляется к виду и реагирует на касания внутри кадра представления. У него нет собственного крана. Если вы увеличите размер этикетки, то область касания также должна увеличиться в размере.

Я помню, как читал рекомендацию Apple, чтобы область касания была не менее 40x40 точек. Возможно, вы захотите поместить невидимое представление (назовите его tapView) поверх вашей метки, которое немного больше, чем метка (вы можете получить рамку метки и вызвать CGRect.inset(by:) с отрицательными значениями для всех краев. Используйте полученный прямоугольник в качестве tapView и добавьте вид касания поверх своей метки.) Если вы это сделаете, вам следует поместить код в метод viewDidLayoutSubviews() вашего контроллера вида (и каждый раз, когда вы меняете метку nameLabel), чтобы настроить фрейм tapView.

person Duncan C    schedule 24.03.2021