iOS Instagram标签文字布局?它是如何完成的?

时间:2013-11-05 00:33:21

标签: ios objective-c xcode uibutton xib

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

或者,他们使用的是NSAttributedStrings吗?

有什么想法吗?

这是我所指的布局的一个例子。

enter image description here

2 个答案:

答案 0 :(得分:1)

好吧,我目前正在使用NSAttributedStringUITextView来完成所有这些工作,而我目前的代码可以做到。所以我将解释这样做的可能版本。
以下是iOS7的提示和重要步骤:
{0}在iOS7中有一个新属性:NSAttributedString。您可以将其添加到NSLinkAttributeName,并使用检测方法(组合:how to make #key and @key clickable in IOS7Get word from tap in UITextView)进行管理。这是一般的做法。对于以前的版本,你将不得不做更多的工作,但保持这个一般的想法 但是,因为它只针对主题标签,因为你可以检测到水龙头背后的世界,你可以这样做:检测已点击的单词(参见前面的链接),检测这个单词是否有标签,如果是,你可以做无论你想做什么动作。您可以使用NSAttributedString来了解标签的位置,并知道何时“着色”它们。

答案 1 :(得分:0)

这是使用UITextView和NSAttributedString执行此操作的简化方法:

  1. 使用正则表达式获取链接的字符范围。
  2. 将链接样式添加到匹配的范围。
  3. 将自定义属性添加到引用点击操作以执行的范围。
  4. 触摸时,如果字符索引位于匹配范围内,请更改链接格式以突出显示该字符并运行相关的点击操作。
  5. 如何获取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 text utilities