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
違うよ!とかこういう方法あるよ!ってのがあれば教えてください。
では( ¯·ω·¯ )



コメント