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
应用您想要的效果。
然后将其分配给您的UILabel
的attributedText
属性。
【讨论】:
以上是关于ios swift:是不是可以更改字符串中某个单词的字体样式?的主要内容,如果未能解决你的问题,请参考以下文章
如何进行`if`检查键入的单词是不是等于C中字符串列表中的某个单词? [复制]
使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词