TTTAttributedLabelに”containslinkAtPoint"メソッドが追加されていたのでメモ
TTTAttributedLabelに”containslinkAtPoint"メソッドが去年の11月に追加されていたようなのでメモ。
Squashed commit of the following: · 3515373 · TTTAttributedLabel/TTTAttributedLabel · GitHub
このメソッドでなにができるようになったかというと、リンクを有効にしたTTTAttributedLabelにおいて、"リンクを選択したとき”と”リンク以外のTTTAttributedLabelにおいてもジェスチャイベントを拾う”の処理分けが可能になったことだ。
具体的なコードとしては、
protocol tableViewCellDelegate { func tableViewCellLinkTapped(linkurl :String) func tableViewCellTapped(cell :TableViewCell) } class TableViewCell: UITableViewCell, TTTAttributedLabelDelegate, UIGestureRecognizerDelegate { @IBOutlet weak var label: TTTAttributedLabel! var delegate :tableViewCellDelegate? override func awakeFromNib() { super.awakeFromNib() self.label.delegate = self self.label.enabledTextCheckingTypes = NSTextCheckingType.Link.rawValue self.label.linkAttributes = [kCTForegroundColorAttributeName : UIColor.greenColor()] self.label.activeLinkAttributes = [kCTForegroundColorAttributeName : UIColor.orangeColor()] setupGesture() } //一部省略 private func setupGesture() { let selector : Selector = "pressed:" let tapGesture = UITapGestureRecognizer(target: self, action: selector) tapGesture.delegate = self self.addGestureRecognizer(tapGesture) } func pressed(gestureRecognizer: UITapGestureRecognizer) { delegate?.tableViewCellTapped(self) } // MARK: - TTTAttributedLabelDelegate func attributedLabel(label: TTTAttributedLabel!, didSelectLinkWithURL url: NSURL!) { self.delegate?.tableViewCellLinkTapped(url.absoluteString!) } // MARK: - UIGestureRecognizerDelegate override func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { return !self.label.containslinkAtPoint(touch.locationInView(self.label)) } }
こんな感じで書けば、リンクをタップしたときは"tableViewCellLinkTapped"のデリゲートメソッドが実行され、リンク以外の部分(TTTAttributedLabelを含む)をタップしたときには"tableViewCellTapped"のデリゲートメソッドが呼ばれるようにすることができる。
あんま使うことないかもなのですが、業務でちょっと必要になりそうなのでとりあえず良かったです。
一応動くものは以下に。