ios swift:是不是可以更改字符串中某个单词的字体样式?

Posted

技术标签:

【中文标题】ios swift:是不是可以更改字符串中某个单词的字体样式?【英文标题】:ios swift: Is it possible to change the font style of a certain word in a string?ios swift:是否可以更改字符串中某个单词的字体样式? 【发布时间】:2015-03-20 11:32:49 【问题描述】:

我正在从数据库内容中提取字符串。使用一种方法,我从这个字符串中提取最长的单词。

现在我想将整个字符串打印到一个文本标签上,但想在字符串中以不同的颜色和文本样式突出显示最长的单词。

我该怎么做? 我是否需要将字符串切成小块 - 设置格式 - 并将它们重新组合在一起,然后再将其提供给标签?

或者还有其他(更好的)方法吗?

【问题讨论】:

Example of NSAttributedString with two different font sizes?的可能重复 【参考方案1】:

如果您已经知道最长的单词,则必须获取该单词在字符串中的范围。为此,我更喜欢 NSString 方法rangeOfString:

然后,您使用默认属性从字符串创建NSMutableAttributedString。最后,您将突出显示属性应用于您之前计算的范围。

let longString = "Lorem ipsum dolor. VeryLongWord ipsum foobar"
let longestWord = "VeryLongWord"

let longestWordRange = (longString as NSString).rangeOfString(longestWord)

let attributedString = NSMutableAttributedString(string: longString, attributes: [NSFontAttributeName : UIFont.systemFontOfSize(20)])

attributedString.setAttributes([NSFontAttributeName : UIFont.boldSystemFontOfSize(20), NSForegroundColorAttributeName : UIColor.redColor()], range: longestWordRange)


label.attributedText = attributedString

Swift 5.0 更新

let longestWordRange = (longString as NSString).range(of: longestWord)

let attributedString = NSMutableAttributedString(string: longString, attributes: [NSAttributedStringKey.font : UIFont.systemFont(ofSize: 20)])

attributedString.setAttributes([NSAttributedStringKey.font : UIFont.boldSystemFont(ofSize: 20), NSAttributedStringKey.foregroundColor : UIColor.red], range: longestWordRange)

在我的操场上看起来像这样:

【讨论】:

太棒了!谢谢!这就是我要找的东西! 如果字符串中有重复的字符,这将不起作用。假设您有下一个字符串:“VeryLongWord Lorem ipsum dolor。VeryLongWord ipsum foobar”并且您只需要更改位于 ipsum 单词之前的 VeryLongWord 的字体。这段代码失败了。【参考方案2】:

您想查看 Attributed Strings 和 NSRange。您可以同时使用这两者来为字符串中的范围创建不同的样式。这是一个sn-p:

myMutableString = NSMutableAttributedString(string: myString, attributes: [NSFontAttributeName:UIFont(name: "Georgia", size: 18.0)!])

//Add more attributes here:
myMutableString.addAttribute(NSFontAttributeName, value: UIFont(name: "Chalkduster", size: 24.0), range: NSRange(location: 7,length: 5))
myMutableString.addAttribute(NSFontAttributeName, value: UIFont(name: "AmericanTypewriter-Bold", size: 18.0)!, range: NSRange(location:2,length:4))
myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(), range: NSRange(location:2,length:4))

myMutableString.addAttribute(NSFontAttributeName, value: UIFont(name: "Georgia", size: 36.0)!, range: NSRange(location: 0, length: 1))
myMutableString.addAttribute(NSStrokeColorAttributeName, value: UIColor.blueColor(), range:  NSRange(location: 0, length: 1))
myMutableString.addAttribute(NSStrokeWidthAttributeName, value: 2, range: NSRange(location: 0, length: 1))

myMutableString.addAttribute(NSBackgroundColorAttributeName, value: UIColor.greenColor(), range: NSRange(location: 0, length: myString.length))
myLabel.backgroundColor = UIColor.grayColor()

//Apply to the label
myLabel.attributedText = myMutableString

【讨论】:

我很确定您可以创建属性的NSDictionary 并一次性添加它们。比逐个添加要干净得多:) 完全同意,我认为这一步更可取,但是对于刚接触 NSAttributedString 的人来说。更容易逐行阅读:)。不过,我可能会考虑添加字典版本。谢谢 @Chackle 听起来不错!我会看看它!我只需要弄清楚如何设置位置和长度......但这是一个好的开始!【参考方案3】:

NSMutableAttributedString.

您创建一个NSMutableAttributedString 并使用addAttributes:range 应用您想要的效果。

然后将其分配给您的UILabelattributedText 属性。

【讨论】:

以上是关于ios swift:是不是可以更改字符串中某个单词的字体样式?的主要内容,如果未能解决你的问题,请参考以下文章

如何进行`if`检查键入的单词是不是等于C中字符串列表中的某个单词? [复制]

如果用户登录 iOS Swift,则从某个视图开始

使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词

缺少 iOS Swift 方向更改动画

是否可以使用 Swift 在 iOS 7 中更改静态单元格高度?

在 Swift 中将文本限制为一定数量的单词