我正在尝试制作一个简单的咖啡计算器 . 我需要以克为单位显示咖啡量 . 克的“g”符号需要附加到我用来显示金额的UILabel上 . UILabel中的数字正在根据用户输入动态变化,但我需要在字符串末尾添加一个小写“g”,其格式与更新数字不同 . 需要将“g”附加到数字上,以便随着数字大小和位置的变化,“g”随着数字“移动” . 我确信这个问题已经解决了,所以在正确方向上的链接会有所帮助,因为我用Google搜索了我的小心脏 .
我在文档中搜索了一个属性字符串,我甚至从应用程序商店下载了一个“Attributed String Creator”,但结果代码是在Objective-C中,我使用的是Swift . 什么是令人敬畏的,并且可能对其他开发人员学习这种语言有帮助,这是使用Swift中的属性字符串创建具有自定义属性的自定义字体的明显示例 . 这方面的文档非常令人困惑,因为没有非常明确的方法来解决这个问题 . 我的计划是创建属性字符串并将其添加到coffeeAmount字符串的末尾 .
var coffeeAmount: String = calculatedCoffee + attributedText
其中calculateCoffee是一个转换为字符串的Int,“attributedText”是我想要创建的自定义字体的小写“g” . 也许我会以错误的方式解决这个问题 . 任何帮助表示赞赏!
20 回答
属性可以直接在swift 3中设置......
然后在任何具有属性的类中使用该变量
Swift使用与Obj-C相同的
NSMutableAttributedString
. 您通过将计算的值作为字符串传递来实例化它:现在创建属性
g
字符串(heh) . Note:UIFont.systemFontOfSize(_)
现在是一个可用的初始化程序,因此必须先将其解包,然后才能使用它:然后追加它:
然后,您可以设置UILabel以显示NSAttributedString,如下所示:
我强烈建议使用库来归因字符串 . 例如,当您需要一个包含四种不同颜色和四种不同字体的字符串时,它会变得更加容易 . Here is my favorite.它被称为SwiftyAttributes
如果你想使用SwiftyAttributes制作一个包含四种不同颜色和不同字体的字符串:
finalString
将显示为在iOS上使用Attributed Strings的最佳方法是在界面构建器中使用内置的Attributed Text编辑器,并避免在源文件中使用不必要的硬编码NSAtrributedStringKeys .
您可以稍后使用此扩展在运行时动态替换placehoderls:
添加一个故事板标签,其属性文本如下所示 .
然后,您只需在每次需要时更新该值:
确保将原始值保存到initalAttributedString中 .
您可以通过阅读本文来更好地理解这种方法:https://medium.com/mobile-appetite/text-attributes-on-ios-the-effortless-approach-ff086588173e
Swift 4.2
//实现
此答案已针对Swift 4.0进行了更新 .
快速参考
制作和设置属性字符串的一般形式是这样的 . 您可以在下面找到其他常见选项 .
这篇文章的其余部分为那些感兴趣的人提供了更多细节 .
属性
字符串属性只是
[NSAttributedStringKey: Any]
形式的字典,其中NSAttributedStringKey
是属性的键名,Any
是某些Type的值 . 值可以是字体,颜色,整数或其他内容 . Swift中有许多已经预定义的标准属性 . 例如:键名:
NSAttributedStringKey.font
,值:aUIFont
键名:
NSAttributedStringKey.foregroundColor
,值:aUIColor
键名:
NSAttributedStringKey.link
,值:NSURL
或String
还有很多其他的 . 有关详细信息,请参阅this link . 您甚至可以制作自己的自定义属性,例如:
NSAttributedStringKey.myName
,值:某些类型 .如果你做extension:
Creating attributes in Swift
您可以声明属性,就像声明任何其他字典一样 .
请注意下划线样式值所需的
rawValue
.因为属性只是字典,所以您也可以通过创建一个空字典然后向其添加键值对来创建它们 . 如果该值包含多个类型,则必须使用Any作为类型 . 这是上面的
multipleAttributes
示例,以这种方式重新创建:归因于字符串
既然您了解了属性,那么您可以创建属性字符串 .
Initialization
有几种方法可以创建属性字符串 . 如果您只需要一个只读字符串,则可以使用
NSAttributedString
. 以下是一些初始化方法:如果您需要更改属性或字符串内容以后,你应该使用
NSMutableAttributedString
. 声明非常相似:更改归因字符串
举个例子,让我们在这篇文章的顶部创建一个属性字符串 .
首先使用新的字体属性创建
NSMutableAttributedString
.如果您正在使用,请将属性字符串设置为
UITextView
(或UILabel
),如下所示:你不使用
textView.text
.结果如下:
然后追加另一个没有设置任何属性的属性字符串 . (请注意,即使我使用
let
来声明上面的myString
,我仍然可以修改它,因为它是NSMutableAttributedString
. 这对我来说似乎很不顺便,如果将来发生变化我也不会感到惊讶 . 请给我留言发生 . )接下来我们将只选择"Strings"字,它从索引
17
开始,长度为7
. 请注意,这是NSRange
而不是SwiftRange
. (有关范围的更多信息,请参阅this answer . )addAttribute
方法允许我们将属性键名称放在第一个点,第二个点中的属性值和第三个点中的范围 .最后,让's add a background color. For variety, let'使用
addAttributes
方法(注意s
) . 我可以使用此方法一次添加多个属性,但我只会再添加一个 .请注意,属性在某些地方重叠 . 添加属性不会覆盖已存在的属性 .
相关
进一步阅读
How to retrieve the attributes from a tap location
Attributed String Programming Guide(非常有用,但遗憾的是仅在Objective-C中)
Swift:xcode 6.1
对我来说,在设置特定颜色或属性时,解决方案不起作用 .
这确实有效:
我创建了一个解决您问题的在线工具!您可以编写字符串并以图形方式应用样式,该工具为您提供objective-c和swift代码以生成该字符串 .
也是开源的,所以随意扩展它并发送PR .
Transformer Tool
Github
Swift 4
您需要删除swift 4中的原始值
Swift 2.0
Here is a sample:
要么
在测试版6中运行良好
Xcode 6 version :
Xcode 9.3 version :
Xcode 10, iOS 12, Swift 4 :
用我创建的库来解决你的问题真的很容易 . 它被称为Atributika .
你可以在这里找到https://github.com/psharanda/Atributika
Swift 2.1 - Xcode 7
}
//如下所示使用它
Swift 4: