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"のデリゲートメソッドが呼ばれるようにすることができる。

あんま使うことないかもなのですが、業務でちょっと必要になりそうなのでとりあえず良かったです。

一応動くものは以下に。


ushisantoasobu/ContainslinkAtPoint-sample · GitHub