【问题标题】:iOS Instagram Tags Text Layout? How Is It Done?iOS Instagram 标签文本布局?它是如何完成的?
【发布时间】:2013-11-15 19:02:12
【问题描述】:

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

或者,他们是否使用 NSAttributedStrings?

有什么想法吗?

这是我所指的布局示例。

【问题讨论】:

标签: ios objective-c xcode uibutton xib


【解决方案1】:

好吧,我目前正在处理 NSAttributedStringUITextView 以使所有这些工作正常进行,而我当前的代码可以做到这一点。因此,我将解释这样做的可能版本。
以下是使用 iOS7 的提示和大步骤:
NSAttributedString,在 iOS7 中有一个新属性:NSLinkAttributeName。您可以将其添加到您的NSAttributedString,并通过检测方法(组合:how to make #key and @key clickable in IOS7Get word from tap in UITextView)进行管理。这是一般的做法。对于以前的版本,您需要做更多的工作,但要保持这个总体思路。
但是因为,它只适用于主题标签,因为您可以检测点击背后的世界,您可以这样做:检测已点击的单词(请参阅之前的链接),检测该单词是否有标签,如果是,您可以这样做你想要的任何动作。您可以使用NSRegularExpression 来了解主题标签的位置,并知道何时为它们“着色”。

【讨论】:

  • 嗯,很有趣。在我的具体情况下,我很想知道我是否可以通过循环更轻松地做到这一点,因为我有能力在单个 NSString 中获取所有#keys,每个#keys 用逗号分隔,因为这就是我使用的 api 返回的方式相关标签?所以我不必像属性字符串方法那样扫描标签?
  • 嗯,我之前谈到的一部分工作是区分(例如渲染蓝色)什么是主题标签和什么是“普通文本”,这就是我通过 NSAttribuedString 的原因。
【解决方案2】:

这是一种使用 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 text utilities

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多