5

我有一个类似于这个问题但更复杂的问题。我正在尝试在表格视图单元格中绘制文本,该单元格具有右上角的日期标签和右下角的徽章,如下所示:

+-----------------------+----+
| Lorem ipsum dolor sit |DATE|
| amet, consectetur     +----+
| adipiscing elit. Integer   |
| ligula lectus, convallis   |
| non scelerisque      +-----+
| quis, tempor at nibh |BADGE|
+----------------------+-----+

如果有更多或更少的文本,我希望单元格更大或更小:

+-----------------------+----+
| Lorem ipsum dolor sit |DATE|
| amet, consectetur     +----+
| adipiscing elit. Integer   |
| ligula lectus, convallis   |
| non scelerisque quis,      |
| tempor at nibh.  Curabitur |
| eget diam ligula.          |
| Pellentesque a elit        |
| dolor, a ullamcorper +-----+
| risus.               |BADGE|
+----------------------+-----+

旧问题的答案链接到一个项目,该项目显示如何围绕已知形状流动文本。但我事先不知道形状,因为我需要徽章与文本底部对齐。

这甚至可能吗?如果是这样,我如何绘制文本,以及如何计算它的高度?

4

2 回答 2

3

您的情况还不错,因为一切都是矩形,而且宽度似乎是固定的。有关一些入门代码,请参阅ColumnView

这是我将如何攻击它:

  • 共有三个矩形:顶部、中间和底部。顶部和底部具有已知尺寸。只有中间可以垂直伸展。
  • 创建一个CTFrameSetter. 为顶盒创建一个路径并创建一个CTFrame布局。那部分是确定的,所以坚持下去。如果所有文本都适合,那么你就完成了。
  • 为顶框正下方的中间框创建路径。让它尽可能短(我假设你想要一些空间,即使文本可以放在顶部和底部的框中​​)。
  • 为中间框架正下方的底部框创建一条路径。
  • 用于CTFrameSetter为中间和底部框架创建框架。询问它能够布局多少文本。如果它完成了一切,那么你就完成了。这是你愿意画的最小的盒子。
  • 如果溢出,则将中间框的大小增加一行。尝试再次布置中间和底部的盒子。重复直到合适。
  • 现在您知道了整个视图的大小,并且可以布置所有内容。

那里有几个地方需要优化,但它可能比你想象的要快。

于 2013-02-14T01:16:35.353 回答
1

我为此苦苦挣扎了很长时间,试图根据我发送给它的文本来调整弹出框的大小。通常宽度是固定的,你只是想计算高度。此处的开发人员文档中有一篇文章:https ://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/TextLayout/Tasks/StringHeight.html

我在这里找到了一组很好的可重用类别:http: //sheepsystems.com/sourceCode/sourceStringGeometrics.html

即使能够正确调整单元格的大小、更改文本框的形状并在单元格上覆盖日期和徽章以及让文本在其周围流动也不是一件容易的事。您可能需要考虑重新设计表格单元格以使其更轻松一些。像这样的东西:

+-----------------------+----+
| BADGE|                |DATE|
|+-----+      TITLE     +----+
| dolor sit amet, consectetur|     
| adipiscing elit. Integer   |
| ligula lectus, convallis   |
| non scelerisque quis,      |
| tempor at nibh.  Curabitur |
| eget diam ligula.          |
| Pellentesque a elit        |
| dolor, a ullamcorper risus.|
+----------------------------+
于 2013-02-13T19:19:32.047 回答