【问题标题】:How to change UITextView Hyperlink selection background color?如何更改 UITextView 超链接选择背景颜色?
【发布时间】:2016-08-04 09:47:39
【问题描述】:

我正在使用 UITextView 来选择主题标签。它完美地检测水龙头。我的问题是选择颜色。它看起来是黑色的,我希望文本在选择时淡化一点。 这是我现在得到的:

我尝试更改tintColorNSForegroundColorAttributeNameNSBackgroundColorAttributeName,但它不起作用。

【问题讨论】:

    标签: ios hyperlink uitextview uicolor


    【解决方案1】:

    对于检测到的链接的选定或突出显示颜色没有记录属性,但您应该能够通过覆盖委托方法 textView:shouldInteractWithURL:inRange: 并自己更改颜色来实现相同的效果。

    来自UITextViewDelegate 协议参考:

    如果用户点击或长按 网址链接。此方法的实现是可选的。默认情况下, 文本视图打开负责处理 URL 类型的应用程序 并将 URL 传递给它。您可以使用此方法触发 替代操作,例如在 URL 中显示 Web 内容 当前应用程序中的网页视图。

    最后一个参数是一个名为characterRange 的NSRange 对象,它表示包含被点击的URL(或主题标签)的字符范围。使用该范围,您应该能够添加诸如NSForegroundColorAttributeName 之类的属性,以便仅更改被点击的特定主题标签的颜色。

    您可能希望还原对 touchesEndedtouchesCancelled 的任何更改。

    或者,您也可以make your own subclass and manually handle the above

    【讨论】:

      【解决方案2】:

      虽然没有公开的 API 来执行此操作,但我很好奇并决定通过 private header 挖掘 UITextField。我发现UITextField_sharedHighlightView 上有一个类方法,它返回私有_UIHighlightView 类的实例。这是负责突出显示的类。 Swizzling _sharedHighlightView 并更改其颜色将允许您更改任何数据检测到的链接的颜色:

      警告:这是一种使用方法调配和私有 API/属性的 hack。

      class MyTextView: UITextView {
      
          var newHighlightView: AnyObject?
      
          func changeHighlight() {
              self.newHighlightView = UITextView.performSelector(Selector("_sharedHighlightView")).takeUnretainedValue()
              self.newHighlightView?.setValue(UIColor.redColor().colorWithAlphaComponent(0.6), forKey: "_color")
      
              let originalHighlightView = class_getClassMethod(MyTextView.self, Selector("_sharedHighlightView"))
              let newHighlightView = class_getClassMethod(MyTextView.self, #selector(MyTextView.swizzleHighlightView))
              method_exchangeImplementations(originalHighlightView, newHighlightView)
          }
      
          func swizzleHighlightView() -> AnyObject {
              return self.newHighlightView!
          }
      }
      

      在您的视图控制器中:

      let textView = MyTextView(frame: CGRect(x: 0, y: 40.0, width: 200.0, height: 200.0))
      textView.dataDetectorTypes = .All
      textView.editable = false
      textView.text = "Some text.  http://www.google.com/"
      textView.changeHighlight()
      self.view.addSubview(textView)
      

      结果:

      这可能会通过不强制解包任何选项来进一步清理。

      【讨论】:

        【解决方案3】:

        可以解决这个问题,您可以使用 UIButton 而不是 textview。通过使用按钮,您可以获得相同的效果。

        【讨论】:

        • 我故意使用文本视图。要有多个行动点。使用 uibutton 是不可能的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-03-04
        • 1970-01-01
        • 2022-10-22
        • 2016-11-10
        • 2012-10-01
        • 2021-01-01
        • 1970-01-01
        相关资源
        最近更新 更多