以特定方式将 String 转换为 NSAttributedString

2024-01-31

所以我有一个看起来像这样的字符串:Swift , VisualBasic , Ruby

i wanna convert this string to something like this : enter image description here

基本上我想在单个单词后面创建一个背景,是的,我可以使用 NSTokenField 库来获取此行为,但我的文本不是由用户手动输入的,其预先结构化(来自数组),我不想要 NSTokeField 的整个行为,我只是想要像这样的外观和选择(通过选择我的意思是单击退格键即可清除一个单词,整个单词而不是一个字母)

好吧,我知道如何更改文本的颜色,如下所示

   func getColoredText(text: String) -> NSMutableAttributedString {
    let string:NSMutableAttributedString = NSMutableAttributedString(string: text)
    let words:[String] = text.componentsSeparatedByString(" ")
    var w = ""

    for word in words {
        if (word.hasPrefix("{|") && word.hasSuffix("|}")) {
            let range:NSRange = (string.string as NSString).rangeOfString(word)
            string.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: range)
            w = word.stringByReplacingOccurrencesOfString("{|", withString: "")
            w = w.stringByReplacingOccurrencesOfString("|}", withString: "")
            string.replaceCharactersInRange(range, withString: w)
        }
    }
    return string
}

但我不知道如何实现我想要的,如果有人可以为我提供一些指导,那么这对我很有帮助

PS如果我的问题不够清楚,请告诉我,我会添加更多详细信息


只需使用几个就会容易得多UILabels 如果你想要圆角。

如果这是可以接受的,您可以首先生成一个属性字符串数组,例如:

func getAttributedStrings(text: String) -> [NSAttributedString]
{
    let words:[String] = text.componentsSeparatedByString(" , ")

    let attributes = [NSForegroundColorAttributeName: UIColor.whiteColor(), NSBackgroundColorAttributeName: UIColor.blueColor()]

    let attribWords = words.map({
        return NSAttributedString(string: " \($0) ", attributes: attributes)
    })
    return attribWords
}

对于每个属性字符串,我们需要创建UILabel。为此,我们可以创建一个函数,传入一个NSAttributedString并返回一个UILabel:

func createLabel(string:NSAttributedString) ->UILabel
{
    let label = UILabel()
    label.backgroundColor = UIColor.blueColor()
    label.attributedText = string
    label.sizeToFit()
    label.layer.masksToBounds = true
    label.layer.cornerRadius = label.frame.height * 0.5
    return label
}

现在我们将输入字符串转换为标签:

let attribWords = getAttributedStrings("Java , Swift , JavaScript , Objective-C , Ruby , Pearl , Lisp , Haskell , C++ , C")
let labels = attribWords.map { string in
        return createLabel(string)
    }

现在我们只需要在视图中显示它们:

let buffer:CGFloat = 3.0
var xOffset:CGFloat = buffer
var yOffset:CGFloat = buffer

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 320.0, height: 400.0))
view.backgroundColor = UIColor.lightGrayColor()


for label in labels
{
    label.frame.origin.x = xOffset
    label.frame.origin.y = yOffset

    if label.frame.maxX > view.frame.maxX
    {
        xOffset = buffer
        yOffset += label.frame.height + buffer

        label.frame.origin.x = xOffset
        label.frame.origin.y = yOffset
    }

    view.addSubview(label)
    xOffset += label.frame.width + buffer
}

此时,我们还可以通过以下命令将视图大小调整为标签的高度:

if let labelHeight = labels.last?.frame.height
{
    view.frame.height = yOffset + labelHeight + buffer
}

Throwing this code in a swift playground results in: enter image description here

如果您不能使用标签,如果您想要可编辑的UITextView例如,我会放弃圆角,只说:

let attribWords = getAttributedStrings("Java , Swift , JavaScript , Objective-C , Ruby , Pearl , Lisp , Haskell , C++ , C")
let attribString = NSMutableAttributedString()
attribWords.forEach{
    attribString.appendAttributedString(NSAttributedString(string: "  "))
    attribString.appendAttributedString($0)
}
textView.attributedText = attribString
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以特定方式将 String 转换为 NSAttributedString 的相关文章

  • iOS 有没有办法通过按钮调整图像大小?

    如下图所示 按钮的图像跨越了按钮边界 有没有办法通过故事板或以编程方式使图像适合按钮的边界 更改按钮Style from Plain to Default 这是一个限制为60 x 60 with a 80 x 80图像与Style Plai
  • 如何模拟应用程序在后台被杀死?

    我试图验证我的应用程序 App1 在启动另一个应用程序 App2 后被系统关闭时行为是否正确 有什么方法可以模拟或强制这种行为吗 在 App2 运行时告诉模拟器模拟内存警告不会执行任何操作 直到 App1 返回前台为止 从调试器中杀死 Ap
  • 如何查看iOS11屏幕录制是否开启?

    为了检测 iOS11 屏幕录制功能的开或关 我使用了 isCaptured 和 UIScreenCapturedDidChange 通知 当我第一次启动应用程序并在 iOS11 内置屏幕录制功能上时 它会通知选择器方法 值为 True 但是
  • 将粗体应用于 NSAttributedString 的一部分,同时保留字体大小和外观

    我正在为 iOS 开发一个富文本编辑器 使用UITextView连同一个NSAttributedString 它的功能与传统功能类似 即选择一个区域 单击一个按钮 并将该效果应用于该区域 同时保留文本上的任何其他属性 不幸的是NSAttri
  • 将蒙版图像作为 PNG 文件写入磁盘

    基本上 我从网络服务器下载图像 然后将它们缓存到磁盘上 但在这样做之前 我想屏蔽它们 我正在使用每个人似乎都指出的屏蔽代码 可以在这里找到 http iosdevelopertips com cocoa how to mask an ima
  • 获取 iPhone 中的按钮标签值

    我动态制作了20个Button 并且获取了所有Button的标签值 但我需要知道如何使用该标签值 我需要有关按下的每个按钮和标签值的信息 那么 我该如何使用这些标签值呢 您需要设置每个按钮的目标操作 button setTarget sel
  • 当应用程序处于后台时,替代 UserNotificationCenter Delegate 的 willPresent

    我正在尝试弄清楚是否可以通过本地通知来实现我的目标 或者是否需要切换到远程通知 我正在练习 iOS 10 Swift 3 方法是构建一个闹钟程序 该程序在一天中的设定时间播放 RSS 更新的广播节目的最新一集 当应用程序位于前台时 可以通过
  • 使用静态库在 ios 项目中设置构建配置以在 xcode 4 中创建存档的正确方法是什么?

    我有一个依赖于多个静态库的工作应用程序 我已将其作为依赖项添加到应用程序中 并在构建阶段添加到与静态库位的链接中 一切都在模拟器和我连接的 iPad 上构建并运行良好 我想创建一个用于试飞的 ipa 文件 因此我按照试飞网站上的说明进行操作
  • Swift 3 中的 _ArrayType 去了哪里?

    我有一些用于中继的代码 ArrayType在 Swift 3 之前 我试图了解公共协议发生了什么 ArrayType 任何想法 ArrayType被重命名 ArrayProtocol 您可以在ArrayType swift https gi
  • 如何使自定义键盘扩展再次成为第一响应者

    我正在制作一个自定义键盘扩展 在这个键盘中 我有另一个 uitextfield 作为搜索字段 因此当我在自定义键盘上键入时 我不会将文本发送到 safari 的文本字段或某些聊天应用程序的文本字段 而是发送将文本发送到自定义键盘中的 uit
  • 强制变量声明的协议 - Objective C

    是否可以在 protocol中声明变量 只是为了强制程序员在实现类 实现此协议的类 标头和实现中添加这些变量 Thanks 简短回答 不 不可能那样做 您最多可以强制方法和属性的可用性
  • 类型名称已知却未知?

    Xcode 突然显示了此错误 未知类型名称 我会解释一下 我的 StoriesViewController h import
  • Dropbox iOS SDK 始终为 isLinked 返回“YES”:

    我正在使用 iOS Dropbox SDK 想要检查我的应用程序是否已与 Dropbox 帐户链接 所以我这样做 if self isLinked NSLog linked However self isLinked总是返回YES 即使在清
  • 如果我在新证书上续订我的配置文件(企业分发方法),我的应用程序是否会停止?

    我有一个通过企业分发方法发布的应用程序 分发证书将在一个月后过期 因此我创建了一个新证书 此外 我还根据具有相同捆绑 ID 和应用 ID 的新证书更新了配置文件 旧的配置文件将像旧证书一样在 1 个月后过期 我的应用程序是通过此配置文件和证
  • 何时以及为何使用多个 NSManagedObjectContext?

    基本上 我在我的应用程序中只使用了一个 moc 但我认为在某些情况下我应该使用多个 NSManagedObjectContext 什么时候应该使用多个 NSManagedObjectContext 我听说在某些情况下我应该使用 3 moc
  • 翻转通过CVOpenGLESTexture获得的OpenGL ES纹理

    在我尝试 OpenGL ES 2 0 的最后一天 当我尝试将两个投影纹理 一个精灵动画和一个视频文件纹理 应用到天空盒时 我开始像存根一样简单地用手敲击键盘 奇迹般地它就成功了 一切都开始工作了 然而 从视频文件创建的纹理是颠倒的 换句话说
  • 扩展中的 Swift 覆盖函数

    如果我有课 class Spaceship
  • 具有自定义视图的相机

    我的应用程序使用相机 我想在相机预览上添加叠加层 例如 我想在使用相机时使用相框 还想添加一个用于相机操作的自定义栏 请帮助我做同样的事情 您可能正在尝试使用 UIImagePickerController 但我知道这个可以解决你的问题 您
  • 在 wkwebview 中启用摄像头和麦克风访问

    我有一个针对移动设备优化的网络应用程序 它利用getUserMedia访问网络摄像头和麦克风资源 我正在将这个应用程序包装在WKWebView因为我想提供原生应用程序体验 我知道 iOS 不允许通过浏览器访问相机 但是有什么方法可以使用本机
  • CoreBluetooth 功能无法从 Singleton 运行

    所以我目前在 iPad 和 iPhone 之间建立了蓝牙连接 我已经在中创建了我的测试代码ViewController一切正常 现在我把它移到了 2 个经理类 第一个是CBCentralManager和一个用于CBPeripheralMan

随机推荐

  • PHP 在选择复选框时读取行的所有内容

    I have a PHP form as attached The form entries are pulled from mysql server On selection of a particular checkbox I need
  • 将 Numpy 数组保存为图像

    我有一个 Numpy 数组类型的矩阵 我如何将它作为图像写入磁盘 任何格式都可以 png jpeg bmp 一个重要的限制是 PIL 不存在 Using PIL https pillow readthedocs io en stable 保
  • 适用于多个目的地和单个来源的 iOS MKDirections

    我的应用程序需要从一组 10 个步行点中获取距离用户 最近 的步行点 我已经看到 MKDirections 使用 calculateDirectionsWithCompletionHandler 针对单个源 目标位置执行此操作 我的问题是
  • 每 x 秒调用一次函数(Python)[重复]

    这个问题在这里已经有答案了 我想每 10 秒调用一个函数 实际上 它是一个 Web API 但该函数可能需要随机 t 秒才能返回 假设 t 为 0 1 至 1 0 秒 我们能想到的最简单的代码是 while True func take t
  • Docker BuildKit --mount=type=cache 不起作用,为什么?

    我正在尝试实施Buildkit 的缓存挂载功能 https github com moby buildkit blob master frontend dockerfile docs experimental md run mounttyp
  • 多个源代码存储库

    我使用 Mercurial 对源代码进行版本控制 但有些人更喜欢其他版本控制系统 如 git Bazaar SVN CVS 我想知道 是否可以同时将一个存储库存储在多个系统下 以便人们可以使用他们想要的任何存储库 GitHub 开发了hg
  • Nginx 无法加载 CSS 和 JS 文件(MIME 类型错误)?

    我的网站上出现以下错误 Error There are multiple templates named velvet Each template needs a unique name 1b1a247fc034d5089f331ec954
  • 如何在 Angularjs 中使用 $event 更新事件点击时的 ng-model

    http plnkr co ywhmyO http plnkr co ywhmyO 我尝试过编译和指令 但一无所获 示例中的编译代码是直接从 Angular 网站上撕下来的 但我不知道如何使用它 非常感谢任何指导 你被这样的事实绊倒了ng
  • 如何在类图中显示单例关系

    如果一个类包含指向单例类的指针 它可以是aggregation 据我了解 这不可能是has a关系 因为该类不会创建单例类的实例 它只是像这样使用它association关系 标题并不像所写的那样100 完全有意义 有单例类 但没有真正的单
  • 以编程方式设置 GoogleMapOptions

    我像这样膨胀我的片段 GoogleMap map MapFragment getFragmentManager findFragmentById R id MapFragment map Fragment getMap 在这里我有我的选择
  • Lambda 日志和 CloudWatch PutLogEvents 限制

    I know Lambda 调用PutLogEvents在内部记录消息 CloudWatch 有限制PutLogEvents PutLogEvents 每个日志流每秒 5 个请求 我想知道 Lambda 日志流也可以被限制吗PutLogEv
  • Javascript 将 unicode 字符串转换为“标题大小写”

    我有一个 javascript 大小写转换问题 由于非英文字母 我无法解决该问题 我主要关心的是土耳其字母 我需要做的是这样的 你好世界 gt 你好世界 你好世界 gt 你好世界 你好世界 gt 你好世界 这是我到目前为止所取得的成就 St
  • Rails + Rspec + 机架 + 会话测试

    Gemfile 文件 机架 gt 1 6 0 我在将会话变量从 rspec 测试传递到 Rack 中间件时遇到了一些问题 我在互联网上浏览了很多文章 但没有任何解决方案可以帮助我理解 所以基本上我希望能够在我的中间件类中做到这一点 req
  • Grizzly / Glassfish - 无法建立 websockets 握手

    我正在尝试让 WebSockets 在 Grizzly Glassfish 之上工作 我已经克隆了示例 WebSockets 聊天应用程序 http java net projects grizzly sources git show sa
  • realloc() 旧大小无效

    我正在做 K R C 编程书中的一个练习 该程序用于从用户输入的一组行中找到最长的行 然后打印它 这是我写的 部分内容直接摘自书中 include
  • 将值插值作为属性组件

    我有一个关于 Angular2 中的插值是如何完成的问题 例如 我有组件 X 其值为 Input 在父组件中我有这样的代码
  • 如何在保持纵横比的同时将 div 包含在视口内

    存在一个正方形 div 其宽度为任意百分比 并且高度相同 需要随窗口缩放 它必须保持在视口的范围内 即 不剪裁到外部 并保持其正方形形状 本质上是复制background size contain CSS 的特性 我需要支持iOS Safa
  • 什么是 Java EE? [复制]

    这个问题在这里已经有答案了 我意识到它的字面意思是 Java 企业版 但我要问的是 这到底意味着什么 当公司需要 Java EE 经验时 他们真正需要的是什么 有使用 EJB 的经验吗 有 Java Web 应用程序经验吗 我怀疑这对不同的
  • 无法解码 JSON 对象:期望值:第 1 行第 1 列(字符 0)

    这个问题有点重复 但我找不到解决方案 当我调用 Flask 应用程序并传递 JSON 数据时 出现错误 Failed to decode JSON object Expecting value line 1 column 1 char 0
  • 以特定方式将 String 转换为 NSAttributedString

    所以我有一个看起来像这样的字符串 Swift VisualBasic Ruby i wanna convert this string to something like this 基本上我想在单个单词后面创建一个背景 是的 我可以使用 N