当前位置: 首页 > 知识库问答 >
问题:

如何使用Swift生成属性字符串?

堵龙野
2023-03-14

我正在试着做一个简单的咖啡计算器。我需要显示以克为单位的咖啡量。克的“G”符号需要附加到我用来显示数量的UILabel上。UILabel中的数字随着用户输入而动态变化很好,但我需要在字符串末尾添加一个小写“G”,它的格式与更新数字的格式不同。“G”需要附加在数字上,以便随着数字大小和位置的改变,“G”会随着数字“移动”。我肯定这个问题以前已经解决了,所以一个正确方向的链接将是有帮助的,因为我已经谷歌了我的小心脏出来。

我在文档中搜索了一个属性化字符串,甚至从app store下载了一个“属性化字符串创建器”,但生成的代码是Objective-C的,我使用的是Swift。一个使用Swift中的属性化字符串创建具有自定义属性的自定义字体的清晰示例将是很棒的,并且可能对学习这种语言的其他开发人员有帮助。这方面的文档是非常混乱的,因为没有一个非常清楚的路径如何这样做。我的计划是创建attributed字符串并将其添加到我的coffeeAmount字符串的末尾。

var coffeeAmount: String = calculatedCoffee + attributedText

其中calculatedCoffee是一个转换成字符串的Int,而“AttributedText”是我正在尝试创建的带有定制字体的小写“G”。也许我做错了。感谢任何帮助!

共有1个答案

卫胜
2023-03-14

这个答案已经为Swift4.2更新。

制作和设置属性化字符串的一般形式如下所示。您可以在下面找到其他常见选项。

// create attributed string
let myString = "Swift Attributed String"
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttrString = NSAttributedString(string: myString, attributes: myAttribute) 

// set attributed text on a UILabel
myLabel.attributedText = myAttrString
let myAttribute = [ NSAttributedString.Key.foregroundColor: UIColor.blue ]
let myAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myAttribute = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.single.rawValue ]
let myShadow = NSShadow()
myShadow.shadowBlurRadius = 3
myShadow.shadowOffset = CGSize(width: 3, height: 3)
myShadow.shadowColor = UIColor.gray

let myAttribute = [ NSAttributedString.Key.shadow: myShadow ]

这篇文章的其余部分将为有兴趣的人提供更多的细节。

    null
extension NSAttributedString.Key {
    static let myName = NSAttributedString.Key(rawValue: "myCustomAttributeKey")
}
// single attributes declared one at a time
let singleAttribute1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let singleAttribute2 = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
let singleAttribute3 = [ NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// multiple attributes declared at once
let multipleAttributes: [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.foregroundColor: UIColor.green,
    NSAttributedString.Key.backgroundColor: UIColor.yellow,
    NSAttributedString.Key.underlineStyle: NSUnderlineStyle.double.rawValue ]

// custom attribute
let customAttribute = [ NSAttributedString.Key.myName: "Some value" ]

请注意下划线样式值所需的rawvalue

因为属性只是字典,所以您也可以通过制作一个空字典,然后向其中添加键-值对来创建它们。如果值将包含多个类型,则必须使用any作为类型。下面是上面的MultipleAttributes示例,以以下方式重新创建:

var multipleAttributes = [NSAttributedString.Key : Any]()
multipleAttributes[NSAttributedString.Key.foregroundColor] = UIColor.green
multipleAttributes[NSAttributedString.Key.backgroundColor] = UIColor.yellow
multipleAttributes[NSAttributedString.Key.underlineStyle] = NSUnderlineStyle.double.rawValue

既然理解了属性,就可以制作属性化字符串了。

// Initialize with a string only
let attrString1 = NSAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let attrString2 = NSAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes1 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let attrString3 = NSAttributedString(string: "Hello.", attributes: myAttributes1)
// Create a blank attributed string
let mutableAttrString1 = NSMutableAttributedString()

// Initialize with a string only
let mutableAttrString2 = NSMutableAttributedString(string: "Hello.")

// Initialize with a string and inline attribute(s)
let mutableAttrString3 = NSMutableAttributedString(string: "Hello.", attributes: [NSAttributedString.Key.myName: "A value"])

// Initialize with a string and separately declared attribute(s)
let myAttributes2 = [ NSAttributedString.Key.foregroundColor: UIColor.green ]
let mutableAttrString4 = NSMutableAttributedString(string: "Hello.", attributes: myAttributes2)

首先创建具有新字体属性的NSMutableAttributedString

let myAttribute = [ NSAttributedString.Key.font: UIFont(name: "Chalkduster", size: 18.0)! ]
let myString = NSMutableAttributedString(string: "Swift", attributes: myAttribute )

如果您正在进行操作,请将属性化字符串设置为UITextView(或UILabel),如下所示:

textView.attributedText = myString

您不使用textview.text

let attrString = NSAttributedString(string: " Attributed Strings")
myString.append(attrString)

接下来我们只需选择“Strings”单词,它从索引17开始,长度为7。请注意,这是一个nsrange而不是一个Swiftrange。(有关范围的更多信息,请参阅此答案。)addattribute方法允许我们将属性键名称放在第一个位置,将属性值放在第二个位置,将范围放在第三个位置。

var myRange = NSRange(location: 17, length: 7) // range starting at location 17 with a lenth of 7: "Strings"
myString.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.red, range: myRange)

最后,让我们添加一个背景色。对于Variete,让我们使用addattributes方法(注意s)。我可以用这个方法一次添加多个属性,但我只需要再添加一个。

myRange = NSRange(location: 3, length: 17)
let anotherAttribute = [ NSAttributedString.Key.backgroundColor: UIColor.yellow ]
myString.addAttributes(anotherAttribute, range: myRange)

注意,属性在某些地方是重叠的。添加属性不会覆盖已经存在的属性。

    null
    null
 类似资料:
  • 问题内容: 我是一名新的iOS开发人员。我想知道如何在Swift中生成条形码。 我已经有了代码,可以从多种资源中学习如何读取条形码,但是我没有发现任何有关从字符串生成条形码的内容。 非常感谢! PS:我知道对此也有类似的问题,但这是针对Objective-C的。我不了解Obj-C,但发现来自.NET很难。 问题答案: 您可以使用CoreImage()过滤器来做到这一点! ~~~~ 较新的版本,且初

  • 我正在使用jOOQ codegen maven插件和jOOQ meta hibernate扩展成功地生成jOOQ类。 表/列的生成类和方法的名称使用实际的DB表和列名。 生成是否可以在类简单名称和实例变量名称上使用实体(名称=表)和列(名称=列)? 对我来说,在使用jOOQ创建查询时,使用与JPA类相同的名称会更直观。 谢谢

  • 问题内容: 我正在努力用Java生成JSON字符串。 实际输出: 预期输出: 问题答案: 写 代替

  • 问题内容: 使用java如何生成随机的字母数字字符串? 问题答案: 算法 要生成随机字符串,请连接从可接受的符号集中随机抽取的字符,直到字符串达到所需的长度为止。 实例 这是一些相当简单且非常灵活的代码,用于生成随机标识符。阅读以下信息以获取重要的应用笔记。 用法示例 为8个字符的标识符创建不安全的生成器: 为会话标识符创建一个安全的生成器: 创建具有易于阅读的代码的生成器以进行打印。字符串比完整

  • 问题内容: 如何在Swift中生成随机的字母数字字符串? 问题答案: Swift 4.2更新 Swift 4.2在处理随机值和元素方面引入了重大改进。您可以在此处阅读有关这些改进的更多信息。这是减少到几行的方法: Swift 3.0更新 原始答案:

  • 问题内容: 我正在编写一个与已在使用的Google Analytics(分析)API交互的Angular应用。Google返回的数据以“ ga:”为前缀,例如“ ga:newVisits”示例。 如果我使用表达式{{total.ga:newVisits}},Angular无法解析它。逃避冒号继续的任何尝试均导致错误或完全逃避我的表达。 如何将{{total.ga:newVisits}}传递给Ang