• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - NSLayoutManager:如何在只有可渲染字形的地方填充背景颜色

[复制链接]
菜鸟教程小白 发表于 2022-12-11 20:48:14 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

默认布局管理器填充没有文本(最后一行除外)的背景颜色(通过 NSAttributedString .backgroundColor 属性指定)。

enter image description here

我已经通过子类化 NSLayoutManager 并覆盖 func drawBackground(forGlyphRange glyphsToShow: NSRange, at origin: CGPoint) 来实现我想要的效果,如下所示:



enter image description here

但是,这不能处理属性字符串中由范围指定的多种颜色的可能性。我怎样才能做到这一点?我看过 fillBackgroundRectArray 却收效甚微。



Best Answer-推荐答案


How might I achieve this?

这是我如何达到您的目标,在著名的 Lorem ipsum... 中以不同颜色突出显示 “sit” 术语,该术语足以在多个测试中进行测试行。

支持以下代码的所有基础(Swift 5.1,iOS 13)this answer 中提供为清楚起见,不会在此处复制⟹它们导致了结果1

enter image description here

在您的情况下,您想突出显示字符串的某些特定部分,这意味着这些元素由于其内容而应具有专用的关键属性⟹在我看来,这取决于 textStorage 来处理用它。

MyTextStorage.swift

// Sent when a modification appears via the 'replaceCharacters' method.
    override func processEditing() {

        var regEx: NSRegularExpression

        do {
            regEx = try NSRegularExpression.init(pattern: " sit ", options: .caseInsensitive)
            let stringLength = backingStorage.string.distance(from: backingStorage.string.startIndex,
                                                              to: backingStorage.string.endIndex)
            regEx.enumerateMatches(in: backingStorage.string,
                                   options: .reportCompletion,
                                   range: NSRange(location: 1, length: stringLength-1)) { (result, flags, stop) in

                                guard let result = result else { return }
                                self.setAttributes([NSAttributedString.Key.foregroundColor : UIColor.black, //To be seen above every colors.
                                                    NSAttributedString.Key.backgroundColor : UIColor.random()],
                                                   range: result.range)
            }
        } catch let error as NSError {
            print(error.description)
        }

        super.processEditing()
    }
}

//A random color is provided for each " sit " element to highlight the possible different colors in a string.
extension UIColor {
    static func random () -> UIColor {
        return UIColor(red: CGFloat.random(in: 0...1),
                       green: CGFloat.random(in: 0...1),
                       blue: CGFloat.random(in: 0...1),
                       alpha: 1.0)
    }
}

如果你从这里构建并运行,你会得到结果 2 显示文本中 "sit" 的每个彩色背景都有问题 ⟹ ​​有一个偏移量lineFragment 和彩色背景矩形之间。

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap