TouchUpInside без LinkAttribute в ASTextNode - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть один текст (ASTextNode)

let contentNode = ASTextNode()

contentNode.maximumNumberOfLines = 7
contentNode.truncationMode = .byTruncatingTail
contentNode.isUserInteractionEnabled = true
contentNode.delegate = self

и в contentNode есть ссылка

Я настраиваю touchUpInSide для contentNode

contentNode.addTarget(self, action: #selector(contentNodeTapped), forControlEvents: .touchUpInside)

@objc func contentNodeTapped() {

    if contentNode.maximumNumberOfLines == 7 {
      contentNode.maximumNumberOfLines = 0
    } else {
      contentNode.maximumNumberOfLines = 7
    }
    UIView.animate(withDuration: 0.2, delay: 0, options: [UIView.AnimationOptions.layoutSubviews], animations: {
      self.contentNode.setNeedsLayout()
      self.contentNode.layoutIfNeeded()
    }, completion: nil)

}

func textNode(_ textNode: ASTextNode!, tappedLinkAttribute attribute: String!, value: Any!, at point: CGPoint, textRange: NSRange) {
    guard let url = value as? URL else { return }
    UIApplication.shared.open(url, options: [:], completionHandler: nil)
}

, когда я нажимаю на contentNode iхочу изменить maximumNumberOfLines, чтобы увидеть весь текст, но это не гладко.Я просто пробую UIView.animate, но это не влияет.

И когда я коснулся ссылки в contentNode, он не вызывает обе функции: contentNodeTapped и tappedLinkAttribute.

Как и когдавызов только по нажатой ссылке tappedLinkAttribute.

Text after tapped

Текст после нажатия

Text after tapped

1 Ответ

0 голосов
/ 20 июля 2019

я считаю, что вы не можете этого сделать, вместо этого вам нужно использовать ASEditableTextNode и использовать ASEditableTextNodeDelegate для захвата события, когда url постучал

Вы можете позвонить

func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {

  // your action here

   return true
}

вам нужно убедиться, что ваш ASEditableTextNode стиль выглядит так, как ваш ASTextNode

...