在 Interface Builder 中使用“属性”标签文本

Posted

技术标签:

【中文标题】在 Interface Builder 中使用“属性”标签文本【英文标题】:Using 'attributed' label text in Interface Builder 【发布时间】:2014-09-16 19:09:45 【问题描述】:

我试图放弃在我的 viewController 中使用 NSAttributedString,选择在 UILabel 的属性检查器的“文本”字段中使用“属性”选项(与“普通”相对)。

我已经选择了我想要归属的单个单词,并更改了它们的字体,这在文本预览窗口和 IB 本身的场景中得到了正确反映:

但是,模拟器没有反映这些更改,似乎在运行时未使用为属性指定的字体(当我更改颜色时,这按预期工作)。我已将字体添加到我的项目和我的 plist 中,但无济于事:

我没有找到有关此功能的文档,它很可能与 IB 中的“文本样式”功能非常相似(目前基本上没用)-但只是想看看是否有人在做类似的事情时有运气过去。

非常感谢任何帮助或建议,谢谢。

编辑 03/07/15 好吧,我很高兴地报告这个问题最终在 Xcode 7 中得到解决(仍处于测试阶段)。所以我们终于可以解决这个问题了。感谢所有试图和我一起解决这个问题的人。

【问题讨论】:

请提供您的 Xcode 版本 您是否在界面构建器中为标签使用了尺寸等级?我的意思是您是否尝试通过界面构建​​器为不同大小的类设置不同的字体大小? 我在 Xcode 7.1 (7B91b) 中仍然遇到这个问题。 Xcode 7.3 中仍然存在这个问题。 【参考方案1】:

试试这个

在我的情况下,当我尝试将“Silversky Technology”设置为来自界面构建器的标签的属性文本时,它在我在模拟器中运行时不显示,但在界面构建器中显示。 所以我使用了一个技巧,我将 Silversky 字体设置为比技术文本大 1 个像素。

属性文本与相同大小的字体有问题所以改变 1 个字的大小这对我有用。

可能这是 xcode 错误,但这个技巧对我有用。

【讨论】:

【参考方案2】:

在 Xcode 7.0 beta 中:我发现这是可行的。

故事板: http://imgur.com/Wb5H4ds

输出:

http://imgur.com/iOV8tJF

.你可以动态地做。

-(void)attributedText
UITextView *textView = [[UITextView alloc]initWithFrame:CGRectMake(20, 100, 200, 44)];

NSString *newsTitle = @"Hello";
NSString *sportTtle = @"World";
NSString *title = [NSString stringWithFormat:@"%@ %@", newsTitle,sportTtle];
textView.text = title;

UIColor *color = [UIColor redColor];
UIFont *font = [UIFont fontWithName:@"Arial" size:20.0];

NSDictionary *attrs = @NSForegroundColorAttributeName : color,NSFontAttributeName:font;

NSMutableAttributedString * attrStr = [[NSMutableAttributedString alloc] initWithAttributedString:textView.attributedText];
[attrStr addAttributes:attrs range:[textView.text rangeOfString:sportTtle]];
textView.attributedText = attrStr;
[self.view addSubview:textView];

【讨论】:

【参考方案3】:

字体问题。解决方法:清理/清理构建文件夹。有时帮忙。 /更新:我知道这听起来像是一个“愚蠢的建议”——但它在我的情况下是个把戏,所以在这里发布——也许是为了节省别人的时间。

【讨论】:

【参考方案4】:

这有一个简单而快速的解决方案,这对我来说是有效的。 该解决方案是在 AppDelegate.swift 文件的 didFinishLaunchingWithOptions 函数中添加代码行:

对于文本视图

UITextView.appearance().font = UIFont(name: "IranSans", size: 17)

标签

UILabel.appearance().font = UIFont(name: "IranSans", size: 17)

对于 UiView 的其余部分,像这两个 ☝️

【讨论】:

【参考方案5】:

我最初的问题:

自定义字体,包含并与项目捆绑在一起。 XCode 版本 11

使用带有属性文本的 UILabel,更改普通字体和斜体版本的使用。

Interface Builder 在单个 UILabel 中显示正常和斜体字体 - 模拟器和 测试设备仅显示正常字体

清理构建文件夹没有帮助。

我的工作(解决方法)解决方案:

我使用文本编辑器打开了 Interface Builder 文件 (*.storyboard) 并操作了颜色属性。我的文字全是白色的。我将所有斜体设置为 99% 白色,将所有普通字体设置为 100% 白色。

<color key="NSColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>

<color key="NSColor" red="0.99" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>

总结

尝试在不同字体的文本部分之间制作不可见的交替差异(属性) - 使用文本编辑器

【讨论】:

【参考方案6】:

唯一对我有用的是更改字体,所以我做了以下操作:

    SF Pro Text 表示整个文本,Arial 表示我想分隔的文本。 使用NSMutableAttributedString.enumerateAttributes 找到Arial 字体并按照我想要的方式进行修改。 将字体改回SF Pro Text

希望对某人有所帮助。

【讨论】:

【参考方案7】:

我在 xcode 6.1 中得到了这个工作。我添加了一个带有“Hello World”字样的 UILabel,并将字体更改为 Didot。

这是我的故事板的 xml 代码。将其与您的匹配,看看是否有问题

<label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" usesAttributedText="YES" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Cd6-WA-P1d">
                            <rect key="frame" x="20" y="91"  />
                            <attributedString key="attributedText">
                                <fragment content="Hello World">
                                    <attributes>
                                        <color key="NSColor" cocoaTouchSystemColor="darkTextColor"/>
                                        <font key="NSFont" size="24" name="Didot"/>
                                        <paragraphStyle key="NSParagraphStyle" alignment="right" lineBreakMode="wordWrapping" baseWritingDirection="natural"/>
                                    </attributes>
                                </fragment>
                            </attributedString>
                            <nil key="highlightedColor"/>
                        </label>

【讨论】:

这是因为 Didot 是默认的 ios 字体之一 (iosfonts.com)。尝试使用不在列表中的字体。在 6.1 中仍然不适合我。【参考方案8】:

我试图在基本样式表视图单元格中使用属性标签来执行此操作。 一旦您在 Interface Builder 中选择了“Attributed”选项,您的自定义字体就不会出现在字体选择器中。

您可能会注意到字体选择器是默认的系统字体选择器。

诀窍是将字体安装到 /Library/Fonts 中。现在,当您将标签更改为 Attributed 时,它们将出现在字体对话框中,以及故事板视图和预览视图中。

但是,这个仍然在运行时不起作用。如果您在另一台未安装字体的计算机上查看情节提要,Interface Builder 将恢复为“紧密匹配”(在我的例子中是 Lucida Grande)。

所有这一切都有一个优势:如果您正在尝试花哨的格式,很高兴在 Interface Builder 中看到它。然后您可以查看情节提要的源代码,并将属性复制到源代码中。 不要忘记在 Interface Builder 中将标签重置为“Plain”,否则如上所述会发生“紧密匹配”问题。

【讨论】:

将标签重置为“普通”意味着您失去了很多关于如何呈现文本的选项,因此这永远不是解决方案......【参考方案9】:

您是否在代码中更改了该标签的文本。 在 Interface Builder 中使用 label 的 config 属性时,不要在代码中更改任何与此 label 相关的内容。

【讨论】:

以上是关于在 Interface Builder 中使用“属性”标签文本的主要内容,如果未能解决你的问题,请参考以下文章

在 Interface Builder 中使用常量

在 Interface Builder 中使用大小类更改字体大小

如何在 Xcode 6 Interface Builder 中使用模板渲染模式?

在 Swift 中使用 IBOutlet 的 UIImageView 在 Interface Builder 中查看

在 Interface Builder 中使用 Suite 将值绑定到 NSUserDefaults

iOS:在 Interface Builder 中使用动态 contentSize 创建 UIScrollView