【Swift5】タップ可能な UILabel &タップ範囲拡大

UITableViewCell に置いた UILabel をタッチして処理をしたい事がありました。
そのときは日付を表示した UILabel だったのですが、日付ってだいたい小さく表示されるじゃないですか?
なので、タップ領域を拡大した UILabel を実装しました。

実装

class TapLabel: UILabel {

    var expandTouchArea: UIEdgeInsets = .zero
    private var handler: (() -> ())?

    override func awakeFromNib() {
        self.isUserInteractionEnabled = true
        self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tapLabel(sender:))))
    }

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        var rect = bounds
        rect.origin.x -= self.expandMargin.left
        rect.origin.y -= self.expandMargin.top
        rect.size.width += self.expandMargin.left + self.expandMargin.right
        rect.size.height += self.expandMargin.top + self.expandMargin.bottom
        return rect.contains(point)
    }

    @objc private func tapLabel(sender: UITapGestureRecognizer) {
        self.handler?()
    }

    func tapLabelHandler(completion: @escaping (() -> ())) {
        self.handler = completion
    }

}

使い方

Storyboard or Xib に設置した UILabel の Class を TapLabel に変更

拡大範囲を指定する

// タッチ領域を 10pt 拡大する場合
label.expandTouchArea = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0)

ここの 10pt に関しては、マジックナンバーになってますけど、他のオブジェクトと領域が被らないように、UILabel に設定した Autolayout のマージンとかぶっ込んだ方がいいと思います。
その方が UILabel のマージン変更にも自動で対応しますし!

タップした時の処理を実装

label.tapLabelHandler { [weak self] in
    // タップ処理を実装
}

さいごに

特になしです!w

違うよ!とかこういう方法あるよ!ってのがあれば教えてください。
では( ¯·ω·¯ )

Swift
スポンサーリンク

コメント