首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >具有多个链接的UITextField

具有多个链接的UITextField
EN

Stack Overflow用户
提问于 2018-06-03 02:40:42
回答 1查看 141关注 0票数 -1

我有一个看起来像这样的UITextView:

我要做的是在“条款和协议”下划线,并在按下时显示另一个控制器,并在按下时显示“隐私政策”,并显示另一个控制器。

我该怎么做呢?我在网上找不到任何关于它的东西。

我可以让它们像这样链接起来:

代码语言:javascript
复制
let attributedString = NSMutableAttributedString(string: "I have read and agreed to all terms and agreements and Privacy Policies")

        attributedString.addAttribute(.link, value: "https://www.hackingwithswift.com", range: NSRange(location: 30, length: 20))
        attributedString.addAttribute(.link, value: "https://www.hackingwithswift.com", range: NSRange(location: 55, length: 16))

        conditionsText.attributedText = attributedString

但我不想让他们思考,而是希望他们是一种手势,可以呈现另一种controller....and,让他们下划线。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-03 02:54:44

您可以通过许多方法来实现这一点,这里使用UILabel

1-扩展UITapGestureRecognizer

代码语言:javascript
复制
extension UITapGestureRecognizer {

  func didTapLabel(label: UILabel, inRange targetRange: NSRange) -> Bool {
    // Create instances of NSLayoutManager, NSTextContainer and NSTextStorage
    let layoutManager = NSLayoutManager()
    let textContainer = NSTextContainer(size: CGSize.zero)
    let textStorage = NSTextStorage(attributedString: label.attributedText!)

    // Configure layoutManager and textStorage
    layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)

    // Configure textContainer
    textContainer.lineFragmentPadding = 0.0
    textContainer.lineBreakMode = label.lineBreakMode
    textContainer.maximumNumberOfLines = label.numberOfLines
    let labelSize = label.bounds.size
    textContainer.size = labelSize

    // Find the tapped character location and compare it to the specified range
    let locationOfTouchInLabel = self.location(in: label)
    let textBoundingBox = layoutManager.usedRect(for: textContainer)
    let textContainerOffset = CGPoint.init(x:(labelSize.width - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x,y: (labelSize.height - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y);
    let locationOfTouchInTextContainer = CGPoint.init(x:locationOfTouchInLabel.x - textContainerOffset.x, y:   locationOfTouchInLabel.y - textContainerOffset.y);
    let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    return NSLocationInRange(indexOfCharacter, targetRange)
  }

}

2-然后检测可点击部件

代码语言:javascript
复制
@IBAction func tapLabel(_ gesture: UITapGestureRecognizer) {
    let text = (myLabel.text)!
    let termsRange = (text as NSString).range(of: "Terms & Conditions")
    let privacyRange = (text as NSString).range(of: "Privacy Policy")

    if gesture.didTapLabel(label: myLabel, inRange: termsRange) {
        print("Tapped terms")
    } else if gesture.didTapLabel(label: myLabel, inRange: privacyRange) {
        print("Tapped privacy")
    } else {
        print("Tapped none")
    }
}

3-用法

代码语言:javascript
复制
    var myLabel:UILabel!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    myLabel = UILabel()
    myLabel.frame = self.view.frame
    myLabel.isUserInteractionEnabled = true
    self.view.addSubview(myLabel!)
    myLabel.text = "By signing Terms & Conditions and Privacy Policy"
    let tapPress = UITapGestureRecognizer(target: self, action: #selector(self.tapLabel(_:)))           
    myLabel.addGestureRecognizer(tapPress)

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50660041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档