iOS:如何显示一盒'tappable tags'

iOS: How to display a box of 'tappable tags'

我的用例是这样的:

用户定义了一些标签(文本如“#asdf”、“#qwerty”、“#let_me_think_about_it”和“#decide later”)。我想在不滚动的情况下在框中显示这些(并且不知道在我显示框之前用户创建了多少标签)。

框本身根本不应滚动,而应显示在 UITableViewCell(正在滚动)中。因此它必须计算建议的高度并响应自动布局机制。如果 (ARM) Mac 用户将 window 的大小调整为比以前更小(或 iOS 用户旋转设备),则该框应根据需要 increase/decrease 其高度(在自动布局的范围内,因为我知道一些问题)。每个标签都应该同时(取消)选择(附加了 UITapGestureRegognizer 的 UILabel?)并且能够显示 'selected'(通过背景视图)。

因此,该框应主要尝试将所有内容水平对齐。如果没有足够的水平space,做一个“换行”并继续下一个“线”。

我当前的解决方案是用户可以水平滚动并点击任何 (UILabel) 视图的 UIScrollView。显示的视图本身是从 NIB 文件加载的,就像 UITableView 一样。这里的问题是第一眼可能看不到任何选定的标签。

如果没有自动布局,我会完全知道该怎么做。但既然有了它,我想在我的 NIB 文件中使用自动布局,想知道你会怎么做?

(您如何计算此类视图所需的宽度并决定何时进行换行(以及如何进行?))

我想我需要一个简单的提示。但如果需要代码解释,ObjC和Swift都可以。 :-)

So, the box should primary try to align all content horizontal. If There's not enough horizontal space, do a "line break" and continue on the next "line".

这听起来像是 UICollectionView with UICollectionViewFlowLayout. You can disable scrolling, and the layout object will tell you the size of the content 的工作,因此您可以调整框的大小。

(How do you compute the required width of such a view and decide when a line break is to be done (and how?))

如果你自己做,你把第一行的所有项目的宽度加起来,如果它大于可用的space,你移动超出限制的项目并任何后续项目到下一行。根据需要重复。但这正是流式布局为集合视图所做的,因此无需自己动手。