带嵌入链接的UITextView

时间:2018-03-22 13:41:02

标签: ios uitextview

我在UITextView中集成的应用程序中有以下文字

使用此应用程序即表示您同意我们的用户协议隐私政策

我想要达到的目标是为点击的两个粗体部分识别单独的点击,这些部分将打开SafariViewController。我需要的是链接识别,我可以放置文本

使用此应用程序即表示您同意我们的用户协议(链接:@“https://google.com/agreement”)和隐私政策(链接:@“{{ 3}}“)。

我希望此文本显示为上面的文本,并且单击textView即可打开这些“隐藏”链接。这可能吗?我找到了一个解决方案,其中一个人创建N个UILabel(每个标签是1个字符),在下划线文本上附加手势识别器。我讨厌这个解决方案,因为当iOS为你提供支持链接文本的TextView时,它更像是一个黑客而不是解决方案。

编辑:

在下面提出一些建议并进行一些调整后找到了一个有效的解决方案...

  1. 您需要创建UITextView,您将在其中创建链接文本

  2. 为普通文本和标记为链接的文本

    创建文本属性
    NSDictionary *orangeTextAttributes = @{NSForegroundColorAttributeName: [UIColor orangeColor], NSFontAttributeName: [UIFont systemFontOfSize:14 weight:UIFontWeightThin], NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
    NSDictionary *normalTextAttributes = @{NSForegroundColorAttributeName: [UIColor blackColor], NSFontAttributeName: [UIFont systemFontOfSize:14 weight:UIFontWeightThin]};
    
  3. 将该属性用于文本

    NSMutableAttributedString *labelAttributedText = [[NSMutableAttributedString alloc] initWithString:@"By using this application, you agree to Google's User Agreement and Privacy Policy." attributes:normalTextAttributes];
    [self addLink:@"https://google.com/terms-of-services" toString:@"User Agreement" ofAttributedString:labelAttributedText];
    [self addLink:@"https://google.com/privacy" toString:@"Privacy Policy" ofAttributedString:labelAttributedText];
    
    self.termsAndPolicyTextView.linkTextAttributes = orangeTextAttributes;
    self.termsAndPolicyTextView.attributedText = labelAttributedText;
    
  4. 添加方法以附加指向TextView文本的链接

    - (void)addLink:(NSString *)urlString toString:(NSString *)substringToBeLinked ofAttributedString:(NSMutableAttributedString *)entireAttributedString {
        NSRange substringRange = [[entireAttributedString string] rangeOfString:substringToBeLinked];
        if (substringRange.location != NSNotFound) {
            [entireAttributedString addAttribute:NSLinkAttributeName value:urlString range:substringRange];
        }
    }
    
  5. 将委托攻击到您的文本视图,并处理已注册链接点击的回调

    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange interaction:(UITextItemInteraction)interaction {
        //This is where you open your link in browser for example
        return NO;
    }
    

1 个答案:

答案 0 :(得分:0)

也许,你应该使用UITextView。如果您使用UITextView,您将能够执行以下操作:

  @IBOutlet weak var textView: UITextView!

  override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        let string = "Google - Yahoo"
        let linkString = NSMutableAttributedString(string: string)
        linkString.addAttribute(NSLinkAttributeName, value: NSURL(string: "https://www.google.com")!, range: NSMakeRange(0, 5))
        linkString.addAttribute(NSFontAttributeName, value: UIFont(name: "HelveticaNeue", size: 25.0)!, range: NSMakeRange(0, 5))
        linkString.addAttribute(NSLinkAttributeName, value: NSURL(string: "https://www.yahoo.com")!, range: NSMakeRange(9, string.characters.count))
        linkString.addAttribute(NSFontAttributeName, value: UIFont(name: "HelveticaNeue", size: 25.0)!, range: NSMakeRange(9, string.characters.count))
        textView.attributedText = linkString
        textView.delegate = self
        textView.selectable = true
        textView.userInteractionEnabled = true
  }

另外,请记住实现委托方法:

  func textViewShouldBeginEditing(textView: UITextView) -> Bool {
        return false
  }

  func textView(textView: UITextView, shouldInteractWithURL URL: NSURL, inRange characterRange: NSRange) -> Bool {
        return true
  }

您需要注意的最后一件事是IB上的UITextView配置:

只需在故事板中选择UITextView,然后转到"显示属性检查器"并选择可选择和链接。确保未选中“可编辑”。