【问题标题】:UILables, Text Flow and LayoutsUILables、文本流和布局
【发布时间】:2012-10-19 15:09:54
【问题描述】:

考虑以下情况,我将段落数据发送到需要放置在背景图像上的视图,该背景图像在顶部和底部具有固定元素(图 1)

图1.

我的想法是将其拆分为 4 个标签(图 1.example2),我的问题是在给定高度固定的标签 1,2 和 3 ar 的情况下,如何让文本流经标签 1-4。我在这里假设标签 3 应该在 4 之前填充,因此在附图中的布局。

有人可以举个例子来建议最好的方法吗?

谢谢

【问题讨论】:

  • 您的目标是哪个 iOS 版本?
  • @Matt iOS 5.1 成为目标
  • @JustinErswell 查看我对所链接问题的回答。我已经更新了我的测试项目(从我的答案链接到那里)以填充类似于示例 1 中的形状。

标签: objective-c ios uilabel uitextview core-text


【解决方案1】:

希望我能提供更多帮助,但我想我至少可以为您指明正确的方向。

首先,您的想法似乎很有可能,但会涉及大量的文本大小计算,这会很丑陋并且可能不会产生理想的结果。我认为它的工作方式是使用 sizeWithFont: 对字符串的测试部分进行二进制搜索:直到您可以对标签适合该大小的内容进行最佳猜测并且仍然看起来“正确”。然后你必须真正分解字符串并分段跟踪它......这似乎是错误的。

在 iOS 6 中(不幸的是,现在不适用于您,但我会将其作为对其他人的潜在好处发布),您可能可以使用一个 UILabel 和一个 NSAttributed 字符串。这里有几个选项可供选择,(我还没有这样做,所以我不确定哪个是最好的)但似乎如果你可以用 html 格式化页面,你可以初始化属性字符串那样。

来自文档: 您可以使用初始化方法 initWithHTML:documentAttributes: 和 initWithHTML:baseURL:documentAttributes: 从 HTML 数据创建属性字符串。这些方法返回由 HTML 定义的文本属性作为字符串的属性。它们通过引用 NSDictionary 对象返回由 HTML 定义的文档级属性,例如纸张和边距大小,如“RTF 文件和属性字符串”中所述。这些方法尽可能地将 HTML 转换为 Cocoa 文本系统的结构,但 Application Kit 不提供对任意 HTML 的完整、真实的呈现。

这里的替代方法是仅使用可用属性,根据图像大小设置行缩进等。我没有在这个级别使用属性字符串,所以我最好的参考是开发人员视频和 NSAttributedString 的编程指南。 https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/AttributedStrings/AttributedStrings.html#//apple_ref/doc/uid/10000036-BBCCGDBG

对于较小版本的 iOS,您最好熟悉 CoreText。最后,您将获得更好看的结果、可重用性/灵活性,不胜枚举。为此,我将从 CoreText 编程指南开始:https://developer.apple.com/library/mac/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html

也许其他人可以提供一些示例代码,但我认为与尝试计算 4 个这样的标签相比,仅查看文档会让您不那么头疼。

编辑: 我更改了 CoreText 的链接

【讨论】:

  • 我以前没有使用过属性字符串,但是如果它们可以工作,那么 Mattt Thompson 的 TTTAttributedLabel 将允许您在 iOS 4 和 5 上使用 NSAttributed 字符串。Github:github.com/mattt/TTTAttributedLabel 文档:mattt.github.com/TTTAttributedLabel
  • 是的,TTTAttributedLabel 可能是一个可行的解决方案,尽管据我所知它不包括 initWithHTML 方法,并且可能不支持足够的段落样式属性。但是,他链接到的 Rob Mayoff 的示例是使用 CoreText 实现此行为的好方法。我建议将属性标签作为一种可能的替代方案,因为它具有更高级别的功能。在该线程中还有一条评论建议使用 Webviews... 这是使用 html 完成布局的可靠方法。
【解决方案2】:

你必须使用 CoreText:用它创建你的 AttributedString 和一个 CTFramesetter。

然后您可以为每个文本框获取一个 CTFrame 并在您的图形上下文中绘制它。

https://developer.apple.com/library/mac/#documentation/Carbon/Reference/CTFramesetterRef/Reference/reference.html#//apple_ref/doc/uid/TP40005105

你也可以使用 UIWebView

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2011-01-15
    • 2012-02-27
    相关资源
    最近更新 更多