UITableViewCell に置いた UILabel をタッチして処理をしたい事がありました。
そのときは日付を表示した UILabel だったのですが、日付ってだいたい小さく表示されるじゃないですか?
なので、タップ領域を拡大した UILabel を実装しました。
実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
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 に変更
拡大範囲を指定する
1 2 |
// タッチ領域を 10pt 拡大する場合 label.expandTouchArea = UIEdgeInsets(top: 10.0, left: 10.0, bottom: 10.0, right: 10.0) |
ここの 10pt に関しては、マジックナンバーになってますけど、他のオブジェクトと領域が被らないように、UILabel に設定した Autolayout のマージンとかぶっ込んだ方がいいと思います。
その方が UILabel のマージン変更にも自動で対応しますし!
タップした時の処理を実装
1 2 3 |
label.tapLabelHandler { [weak self] in // タップ処理を実装 } |
さいごに
特になしです!w
違うよ!とかこういう方法あるよ!ってのがあれば教えてください。
では( ¯·ω·¯ )
コメント