【问题标题】:Add UIGestureRecognizer to individual letters of UILabel将 UIGestureRecognizer 添加到 UILabel 的单个字母
【发布时间】:2015-08-12 10:58:28
【问题描述】:

现在我正在制作一个 iOS 应用程序,我想通过简单地“删除字母”来实现删除 UILabel 中的字母的功能。我遇到问题的部分是将手势识别器添加到 UILabel 的各个字母中。我已经在网上搜索过这个并且什么都没有。为了清楚起见,我不是在整个标签中添加手势识别器,我只是想将它添加到单个字母中。非常感谢任何帮助。

谢谢

【问题讨论】:

    标签: ios uilabel uigesturerecognizer uiswipegesturerecognizer


    【解决方案1】:

    似乎最简单的方法是动态计算字母的位置。使用这个:

    CGSize textSize = [text sizeWithFont:[UIFont boldSystemFontOfSize:size]
                       constrainedToSize:constrainedSize
                           lineBreakMode:NSLineBreakByWordWrapping];
    

    因此您可以获取每个标签使用的字体和大小中字母的大小,并使用[stringInstance length] 属性和[UILabel numberOfLines] 属性获取标签中每个字母的大致中心,然后为每个标签使用一个简单的 tapGestureRecognizer 并在那里调用你的方法

    - (NSString*)letterForPoint:(CGPoint)tapCenter inLabel:(UILabel*)label;
    

    在那里,您可以使用一切来计算每个字母的近似中心,并添加一个 selectableRange 用于错误和纠正用户响应为 x +- 20 像素和 y +- 20 像素。

    Apple 表示,对于 40 像素,可选择的范围小于 40 像素的任何东西都会让用户感到非常恼火,因此您的字体大小实际上应该很大,以方便用户交互。

    【讨论】:

    • 你需要设置 [label setSizeToFit:NO]; ,但据我所知,戏剧上的大小是这样考虑的。
    【解决方案2】:

    如果我理解正确,听起来 UILabel 的子类化是有意义的。

    创建一个LetterLabel: UILabel 类 并在 init 中设置你的 GestureRecognizer 。

    然后,当您创建字母时,每个字母都会附加识别器

    LetterLabel *firstLetter = [[LetterLabel alloc] init]
    LetterLabel *secondLetter = [[LetterLabel alloc] init]
    

    【讨论】:

    • 我不能这样做,因为我需要整个 UILabel 的文本。管理这么多标签会很困难,而且我无法获得整个文本。它还会大大降低性能。
    • 您可以将每个字母添加到一个单词数组中。
    【解决方案3】:

    UIGestureRecognizer 只能应用于 UIView 或其子类(例如,像 Adam 建议的 UILabel)。如果您担心性能,那么我认为您的下一步是:

    1) 子类 UIView 以创建类似 UILabel 的视图的自定义实现。

    2) 在drawInRect:方法中画出自定义标签的字符串

    3) 使用 touchesBegan:withEvent:、touchesMoved:withEvent: 和 touchesEnded:withEvent: 方法来跟踪手指位置,以便移动/重绘支持字符串的字符。

    编辑:

    或者,您可以在自定义标签上使用一个 UIPanGestureRecognizer 来跟踪手指位置,并在自定义标签的范围内移动子层(每个子层可以包含字符串中的一个字符)。这样,您可以更轻松地利用 Core Animation 为角色设置动画(即创建“掉落”效果)。

    【讨论】:

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