如何以流程布局方式排列标签?

时间:2010-06-01 16:35:39

标签: iphone layout uikit

如何安排一些可变长度的UILabel和/或UIButton?我只想将它们添加到UITableViewCell中,它们应该以从左到右的方式排列,就像段落中的文本行一样。

我只发现使用“initWithFrame:...”创建具有固定大小和位置的标签的可能性。就我所知,Interface Builder似乎也是如此。无论是在代码中还是使用自定义单元格XIB文件,任何解决方案都会受到赞赏。

4 个答案:

答案 0 :(得分:1)

UITableViewCellUILabelUIButton都是UIView的子类,UIView的文档说:

  

布局和子视图管理

     
      
  • 视图可能包含零个或多个子视图。
  •   
  • 每个视图都定义了与其父视图相关的默认大小调整行为。
  •   
  • 视图可以根据需要手动更改其子视图的大小和位置。
  •   

所以,这当然是可能的。

您可以使用initWithFrame:使用参数CGRectZero创建标签和按钮,然后使用setBounds:setFrame:调整它们(基于文本或其他内容)(因为现在你只是要设置视图的大小)。然后,将这些视图添加为单元格的contentView

的子视图

然后,在UITableViewCell的自定义子类中,您可以通过覆盖layoutSubviews:的默认行为(无效)来设置子视图帧的原点字段(即CGRect)来实现您的解决方案将子视图定位在单元格的内容视图中(已设置大小)。您可能需要致电setNeedsLayout:layoutIfNeeded:

这实际上是如何实现解决方案的粗略概述,因为遗漏了很多细节。例如,如果您根据titleLabel的文本调整按钮大小,您可能希望将某些按钮填充到宽度和高度,否则按钮将是标签的大小并且看起来很奇怪。在layoutSubviews:方法中,可能有相当多的逻辑来按照您想要的方式布置标签和按钮(例如,如果单元格的所有子视图都是相同类型的所有子视图,例如所有标签,则会更简单) ESP。如果子视图可以换行到新行。

答案 1 :(得分:1)

对于获取宽度和高度的多线UILabel,您应该使用NSString方法sizeWithFont:constrainedToSize:lineBreakMode:然后您可以使用所获得的大小将所有内容放在需要的位置。

答案 2 :(得分:0)

我想做同样的事情,允许用户在文本字段中输入标签 - 有点像当您输入电子邮件地址时,地址被转换为蓝色标签(用户名称在用户名称时)电子邮件地址已在您的联系人列表中)。尚未撰写,但我很乐意与您分享。不幸的是,我不能承诺写这篇文章需要多长时间。但是,如果没有其他人拥有他们可以共享的代码,您需要快速完成工作 - 就像提示一样,请考虑一下:

创建标记视图对象,其中每个对象都知道父文本字段/标记容器视图的大小,以及每个标记对象具有实用程序方法的位置,另一个标记对象可以使用该方法将自身插入到正确的位置。这种方法可以使用简单的迭代流程轻松管理视图和重新布局标记。

答案 3 :(得分:0)

您好 如果你还需要答案...... 要获得文本的大小(然后计算UILabel / UIButton的框架等),请使用sizeWithFont:NSString函数,它将使用指定的字体为您提供文本字符串的宽度/高度。

您需要做一些数学计算,以确定最佳拟合,放置UILabel的位置和间距,但您将拥有执行此操作所需的数据。

希望这有帮助!