【问题标题】:How to customize UILabel clickable如何自定义UILabel可点击
【发布时间】:2011-01-20 04:32:55
【问题描述】:

我想要什么:

在 iPhone 应用程序中,我想在 tableView 中显示信息。 在每个单元格中,文本是这样的:约翰最近听音乐 abcdefg.mp3。 如果需要,文本可以有两行。

在文本中,a.mp3 应该是可点击的,因此当用户触摸 abcdefg.mp3 部分时,将调用另一个页面。当用户触摸abcdefg.mp3时,也会产生一些效果,就像触摸按钮一样。

我做什么:

我计算文本的框架,并为 abcdefg.mp3 使用 UIButton。

我的问题:

有时 abcdefg.mp3 可能是多行的,例如:

abc在第一行的末尾

defg.mp3 在第二行。

在这种情况下我该怎么办?

我已经搜索过:Create tap-able "links" in the NSAttributedString of a UILabel? 但是我认为这里不适合,因为示例中的可点击文本都在一行中。

【问题讨论】:

    标签: iphone uitableview uilabel


    【解决方案1】:

    最简单的方法是将手势识别器添加到实际视图(无论是 UILabel 还是您自己的一些自定义视图)。为了让手势识别器工作,必须将视图设置为 userInteractionEnabled。

    这是一个示例,假设您的标签视图(或其他任何名称)称为 labelView:

    UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTappedOnLink:)];
    // if labelView is not set userInteractionEnabled, you must do so
    [labelView setUserInteractionEnabled:YES];
    [labelView addGestureRecognizer:gesture];
    

    在此示例中,将向self 发送操作消息,该消息将定义为

    - (void)userTappedOnLink:(UIGestureRecognizer*)gestureRecognizer;

    这与连接任何其他 UIControl 子类(例如按钮)的工作方式相同。

    其他注意事项:不要尝试将同一个手势识别器添加到多个视图中,它不会起作用。不要将手势识别器的多个副本添加到多个视图(它不会替换它们,它只是将它们堆叠起来并浪费内存)。您应该在最初创建和配置视图时添加手势识别器。

    有关详细信息,请参阅UIGestureRecognizer 的文档。

    【讨论】:

    • 谢谢~不过,我觉得如果可点击区域是两行的话就复杂了。
    • @scorpiozj:不,只要它都是同一个视图的一部分。
    • @Jason:我也希望用户触摸可点击部分时会有一些效果。如果可点击部分有换行符,处理起来也不容易,是吗?或者你能再解释一下吗?谢谢。
    • @scorpiozj:我想我不完全理解你所说的“换行符”是什么意思。当你有一个换行符时,你是否将第二行写在一个完全独立的视图中?能发个截图吗?
    • @Jason:您的解决方案在某种程度上很容易。但是我遇到了另一个:我把文本“约翰最近听音乐abcdefg.mp3”分成了两个:“约翰最近听音乐”和“abcdefg.mp3”。如果“abcdefg.mp3”必须以两行显示,我怎样才能使用一个控件来按住它,以便它可以添加一个gestureRecognizer?
    【解决方案2】:

    Swift 4.2 版本:

    var labelView = UILabel()
    let gesture = UITapGestureRecognizer(target: self, action: #selector(userTappedOnLink))
    // if labelView is not set userInteractionEnabled, you must do so
    labelView.isUserInteractionEnabled = true
    labelView.addGestureRecognizer(gesture)
    
    
    @objc func userTappedOnLink() {
        print("clicked!")
    }
    

    【讨论】:

    • 这不是有效的 Swift 代码,看起来您在尝试转换上述 Objective C 代码时忘记了一些内容。
    • 在 Swift 3 中,userInteractionEnabled 已重命名为 isUserInteractionEnabled
    【解决方案3】:

    Swift 2.0 版本:

      func userTappedOnLink() {
        print("clicked!")
      }
    
    ///tap and link to FB page
    let gesture = UITapGestureRecognizer(target: self, action: "userTappedOnLink")
    // if labelView is not set userInteractionEnabled, you must do so
    lblStaff.userInteractionEnabled = true
    lblStaff.addGestureRecognizer(gesture)
    

    【讨论】:

      【解决方案4】:

      听起来与他们在 Twitteriffic 中使用Fancy UILabels 所做的类似。基本上,Craig Hockenberry 制作了自己的自定义“数据检测器”,以便他可以在标签和多行文本中插入链接。看到这个问题:Is there a way to create custom UIDataDetectorTypes?

      【讨论】:

      • 我试过 FancyLabel,但我认为当可点击部分在多行时它失败了。一样的感谢
      【解决方案5】:

      您也可以在上方放置一个“不可见按钮”,使用不带文本和图像的自定义按钮。

      【讨论】:

        【解决方案6】:

        我认为您可以使用 textView 并禁用滚动。我为我的项目做了同样的事情,我需要指向网站地址。只需取消选中检查器窗口中“滚动视图”部分中的屏幕截图所示的所有内容。

        【讨论】:

          【解决方案7】:

          通过将UITapGestureRecognizer 添加到标签,使UIlabel 可点击。

          在添加标签之前,不要忘记为 UIlabel 启用用户交互

          这里是示例代码:

          //Tap Gesture
          UITapGestureRecognizer* gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(userTapped:)];
          //Adding userinteraction for label
          [labelName setUserInteractionEnabled:YES];
          //Adding label to tap gesture
          [labelName addGestureRecognizer:gesture];
          

          【讨论】:

            【解决方案8】:

            这个可点击的 UILabel 的解决方案。它不适用于文本中的选择链接。在我看来,对于像 UIButton 这样的可点击 UILabel 来说,这是一个不错的解决方案:

            #import <UIKit/UIKit.h>
            
            @protocol ClickableLablelDelegate <NSObject>
            
            @required
            - (void)onClickLabel:(UILabel *) label;
            
            @end
            
            @interface ClickableLable : UILabel
            
            @property (nonatomic, weak) id <ClickableLablelDelegate> delegate;
            
            @end
            
            
            #import "ClickableLable.h"
            
            @implementation ClickableLable
            
            -(void)awakeFromNib
            {
                [super awakeFromNib];
            
                [self setUserInteractionEnabled:YES];
            }
            
            -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
            {
                [self setBackgroundColor:[UIColor lightGrayColor]];
            }
            
            -(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
            {
                [self setBackgroundColor:[UIColor clearColor]];
            
                if ([_delegate respondsToSelector:@selector(onClickLabel:)]) {
                    [_delegate onClickLabel:self];
                }
            }
            
            -(void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
            {
                [self setBackgroundColor:[UIColor clearColor]];
            }
            

            【讨论】:

            • 请解释一下
            猜你喜欢
            • 2016-02-13
            • 1970-01-01
            • 2015-03-10
            • 2021-07-31
            • 2011-03-02
            • 1970-01-01
            • 2021-08-12
            • 1970-01-01
            相关资源
            最近更新 更多