当文本设置为“属性”时,具有自定义字体的 UITextView 不起作用
Posted
技术标签:
【中文标题】当文本设置为“属性”时,具有自定义字体的 UITextView 不起作用【英文标题】:UITextView with custom font not working when text set to "attributed" 【发布时间】:2015-06-28 17:00:09 【问题描述】:我有一个 UITextView
,其中包含一些来自 .rtf 的文本(直接粘贴到 Xcode 上)
上下文仅包含一种自定义字体(Futura Book BT 11.0)
如果我将“text(attributed)”属性设置为“plain”= 自定义字体从情节提要和应用程序中正确显示
如果我将“text”属性设置为“attributed”=。自定义字体从情节提要中正确显示,但不是从应用程序中显示。
由于我的目标是使用多种字体的文本,如何让属性属性与自定义字体一起使用? (斯威夫特)
谢谢!
【问题讨论】:
【参考方案1】:自定义字体在情节提要中正确显示,但在应用程序中显示不正确。
应用程序根本不显示字体,还是恢复为系统字体?如果它正在恢复到 Helvetica,看起来这可能是 ios 8.1 中的一个已知错误 http://openradar.appspot.com/radar?id=5117089870249984
可能的解决方案: 您是否在模拟器和设备上对其进行了测试?可能是它在模拟器上不起作用,这意味着您可以通过在系统上安装字体来修复它。
【讨论】:
它正在恢复到 Helvetica。 尝试使用 Font Book 在 Mac 上安装它? openradar.appspot.com/radar?id=5117089870249984 = 知道了。看起来正是这个错误! 将字体添加到 Mac 的 Font Book 应用程序并不能解决问题。看起来它可以解决问题。正如其他答案所示,解决方案是在运行时添加属性字符串。像冠军一样工作。更好的是,将您在 IB 中的字体设置为应该像 Helvetica 一样工作的字体。然后执行此操作:[attrib enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, attrib.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop)
并删除字体并添加您的自定义字体。一定要检查粗体、斜体等类型。【参考方案2】:
当我在属性 UILabel 中使用多种自定义字体时,我也遇到了同样的问题。故事板显示正确的结果,但设备没有!
我发现如果字体大小与具有不同自定义字体的文本不同。效果很好!!
所以现在我使用的字体大小略有不同。就像如果一个是 14,我用 14.01 作为另一个。它不可能在情节提要中,所以我将情节提要作为源代码打开并手动设置字体大小,例如:
<attributedString key="attributedTitle">
<fragment content="Do not have account? ">
<attributes>
<color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<font key="NSFont" size="14" name="Roboto-Light"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<fragment content="Login">
<attributes>
<color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="calibratedRGB"/>
<font key="NSFont" size="14.01" name="Roboto-Bold"/>
<paragraphStyle key="NSParagraphStyle" alignment="center" lineBreakMode="wordWrapping" baseWritingDirection="natural" tighteningFactorForTruncation="0.0"/>
</attributes>
</fragment>
<attributedString key="attributedTitle">
但我仍然无法找到它发生的原因!
【讨论】:
尝试更改文本对齐方式。就我而言,当我将其更改为 left 而不是 justified 时它起作用了 在 Xcode 10 上为我添加 .01 到文本字体大小.. :(【参考方案3】:我做什么:
private var _mutableString: NSMutableAttributedString!
if !isTitle
var titleFont: UIFont = UIFont(name: StyleGlobals.TitleFontName, size: StyleGlobals.TitleFontSize)!
self._mutableString.addAttribute(NSFontAttributeName, value: titleFont, range: NSMakeRange(0, count(self._mutableString.string)))
self._mutableString.addAttribute(NSForegroundColorAttributeName, value: StyleGlobals.FontColor, range: NSMakeRange(0, count(self._mutableString.string)))
self.Label.attributedText = self._mutableString
这将应用新的字体颜色以及字体本身。我有一个必须能够包含不同字体的 UILabel。它可以是标题或副标题。因此,当我确定 Label 将包含什么内容时,我必须应用字体。
【讨论】:
我会试试这个。 1-这样做,我可以通过情节提要设置.text吗? 2-如果 UITextview 包含多个自定义字体,我该如何使用您的代码来管理它?再次感谢! 我个人不知道我可以通过情节提要做到这一点。但是,如果您想要一个具有多种字体的字符串。我认为您必须将字符串拆分为多个可变字符串,然后将它们附加在一起:appendAttributedString。至少这似乎是最容易做的事情。 仍然没有建议使用故事板让它工作? 我假设以下方法不起作用:***.com/a/25892126/1235505。关于我在你之前的评论之前的评论。 appendAttributedString 不是必需的。您可以将字体应用于特定范围。原谅我没有早点意识到。可能比 appendAttributedString 性能更好。【参考方案4】:您是否确保“Futura Book BT”作为自定义字体正确添加到您的应用中?
【讨论】:
是的。我绝对确定。 :)【参考方案5】:在我的情况下,问题是我的系统上没有安装字体,所以我用 Font Book 安装了。 然后,字体出现在属性文本标签的列表中。
编辑:现在我在显示当前文本时遇到了一些问题,我这样做了(我使用的是 UILabel,未在 UITextView 上测试):
我的解决方案是从 html 创建一个属性字符串(在 SO 的某处看到这个扩展):
extension String
var html2AttStr: NSAttributedString?
guard let data = dataUsingEncoding(NSUTF8StringEncoding) else return nil
do
return try NSAttributedString(data: data,
options: [
NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,
NSCharacterEncodingDocumentAttribute: NSUTF8StringEncoding],
documentAttributes: nil)
catch let error as NSError
//print(error.code)
return nil
然后我做的是这样的:
let htmlStyle = "<meta charset=\"UTF-8\"><style> body font-family: 'SourceSansPro-Light'; font-size: 18px; text-align: center; b font-family: 'SourceSansPro-Light'; </style>"
let myString = "<font size=\"+2\">Slightly bigger font</font><br><br>Some message with normal text <b>a bold text</b> and some more text"
var attributedString = htmlStyle
attributedString.appendContentsOf(myString)
informationLabel.attributedText = attributedString.html2AttStr
这样做的一个好处是我现在可以在字符串中放入一些“%s”文本,以便用单词/数字/等进行解析。并且更容易翻译和解析。对于格式化的文本,我必须编写一堆代码来查找文本,应用格式而不触及任何周围的东西。这对我来说效果很好:)
【讨论】:
这将使字体显示在 IB 中。但是当你实际运行你的应用程序时,并没有使用字体。 是的,我现在已经到了这一点。曾经可以工作,现在似乎无法正常工作……欢呼! :D 我会用我的修复来编辑我的答案。【参考方案6】:请在 viewDidLayoutSubviews 方法中调用所有代码! 比工作。 在更改字体大小、样式 i viewDidLoad 或 viewWillApperar 方法时,我遇到了很多问题。
所以只需在 viewDidLayoutSubviews 方法中移动您的代码。您可以使用 flag 只更改一次字体,因为此方法可以多次调用:]
【讨论】:
【参考方案7】:您可以使用此扩展程序
extension NSMutableAttributedString
func createAttributedString(word : NSArray, attributeCustomizeFont:UIFont, defaultFont : UIFont, defaultColor : UIColor, allowSpecing : Bool , allowUnderLine : Bool = false) -> NSAttributedString
self.addAttribute(NSAttributedString.Key.font, value: defaultFont, range: (self.string as NSString).range(of: self.string))
if allowSpecing
self.addAttribute(NSAttributedString.Key.kern, value: NSNumber(value: 5), range: (self.string as NSString).range(of: self.string))
else
self.addAttribute(NSAttributedString.Key.kern, value: NSNumber(value: 0), range: (self.string as NSString).range(of: self.string))
self.addAttribute(NSAttributedString.Key.foregroundColor, value: defaultColor, range: (self.string as NSString).range(of: self.string))
for i in 0..<word.count
self.addAttribute(NSAttributedString.Key.font, value: attributeCustomizeFont, range: (self.string as NSString).range(of: word.object(at: i) as! String))
if allowUnderLine
self.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: (self.string as NSString).range(of: self.string))
return self
如何使用扩展程序
var attributedString = NSMutableAttributedString(string:"Test for set custom font")
attributedString = attributedString.createAttributedString(word: ["custom font"], attributeCustomizeFont: UIFont(name: "Arial", size: 18)! , defaultFont: UIFont(name: "Helvetica", size: 15)!, defaultColor: UIColor.black, allowSpecing: false) as! NSMutableAttributedString
因此,整个字符串字体设置为 'Helvetica' 大小为 18,'custom font' 文本设置为 'Arial' 字体大小为 15。
【讨论】:
【参考方案8】:从情节提要中使 UITextview “可选择”将起作用。
【讨论】:
【参考方案9】:✅已修复:
通过将我的UITextView
子类化为KMPlaceholderTextView 进行修复,这对于向文本视图添加占位符也很有用,并且可以像UITextField
一样在Interface Builder 中使用。
现在我可以成功使用自定义字体并添加占位符文本了。
【讨论】:
【参考方案10】:有一个解决方法。只需双击字体文件(在 Finder 中)并将其安装到系统中。
【讨论】:
【参考方案11】:我使用了不同的字体大小,但仍然遇到问题。然后我将文本对齐方式更改为左对齐而不是对齐。然后效果很好。
【讨论】:
以上是关于当文本设置为“属性”时,具有自定义字体的 UITextView 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
如何为 backBarButtonItem 设置自定义字体 [重复]
自定义字体仅在 Interface Builder 中设置时可用
使用文本而不是图标时自定义 Material UI Table 图标属性的字体