3

我一直很好奇 instagram 如何使其标签布局流畅,并想知道这个功能背后的原因是什么?对我来说,似乎他们正在使用 UIButton 并且只是逐行计算按钮的位置?是对的吗?或者是否有一种更简单的方法可以做到这一点,而不必手动计算每个标签的位置逐行/或并排,因为多个标签的宽度适合在一起?

或者,他们是否使用 NSAttributedStrings?

有任何想法吗?

这是我所指的布局示例。

在此处输入图像描述

4

2 回答 2

1

好吧,我目前正在努力NSAttributedString并使UITextView所有这些工作正常进行,而我当前的代码可以做到这一点。所以我将解释这样做的可能版本。
下面是小窍门和大步骤,用 iOS7:
NSAttributedString,在 iOS7 中有一个新的属性 : NSLinkAttributeName。您可以将它添加到您的NSAttributedString, 并使用检测方法(结合:如何在 IOS7 中使 #key 和 @key 可点击以及从 UITextView 中的点击获取单词)您可以管理它。这是一般的做法。对于以前的版本,您将不得不做更多的工作,但要保持这个总体思路。
但是因为,它只适用于主题标签,因为您可以检测点击背后的世界,您可以这样做:检测已点击的单词(请参阅之前的链接),检测该单词是否有标签,如果是,您可以这样做你想要的任何动作。您可以使用 aNSRegularExpression来了解主题标签的位置,并知道何时为它们“着色”。

于 2013-11-05T00:46:37.373 回答
0

这是使用 UITextView 和 NSAttributedString 的简化方法:

  1. 使用正则表达式获取链接的字符范围。
  2. 将链接样式添加到匹配的范围。
  3. 将自定义属性添加到引用要执行的点击操作的范围。
  4. 触摸时,如果字符索引在匹配范围内,则更改链接格式以突出显示它并运行相关的点击操作。

如何在 iOS7 中的位置获取字符索引:

- (NSUInteger) getCharIndexAt: (CGPoint) location
{
    NSLayoutManager *layoutManager = self.layoutManager;
    NSUInteger characterIndex = NSNotFound;
    characterIndex = [layoutManager characterIndexForPoint:location inTextContainer:self.textContainer fractionOfDistanceBetweenInsertionPoints:NULL];

    return characterIndex;
}

另请查看 WWDC 2013 对 TextKit 演示的介绍

ios7 文本实用程序

于 2013-11-05T16:34:33.850 回答