Как настроить UILabel clickable - PullRequest
28 голосов
/ 20 января 2011

Что я хочу:

В приложении для iPhone я хотел бы показать информацию в табличном представлении. В каждой ячейке текст выглядит так: Джон недавно слушал музыку abcdefg.mp3. и при необходимости текст может иметь две строки.

В тексте a.mp3 должен быть активным, поэтому, когда пользователь касается части abcdefg.mp3 , будет вызвана другая страница. Когда пользователь нажимает abcdefg.mp3 , он также будет иметь некоторые эффекты, такие же как прикосновение к кнопке.

Что я делаю:

Я вычисляю рамку текста и использую UIButton для abcdefg.mp3 .

Моя проблема:

Иногда abcdefg.mp3 может быть многострочным, например:

abc находится в конце первой строки

defg.mp3 во второй строке.

Что мне делать в этом случае?

Я уже искал о: Создать "ссылки" с возможностью нажатия в NSAttributedString UILabel? Однако я думаю, что это здесь не подходит, так как кликабельный текст находится в одной строке в примере.

Ответы [ 8 ]

117 голосов
/ 20 января 2011

Самый простой способ - просто добавить распознаватель жестов к реальному представлению (будь то 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 .

8 голосов
/ 09 июня 2015

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!")
}
2 голосов
/ 29 сентября 2015

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)
1 голос
/ 08 мая 2013

Вы также можете просто поместить «невидимую кнопку» выше, используя пользовательскую кнопку без текста и изображений.

enter image description here

1 голос
/ 20 января 2011

Звучит так же, как в Твиттере, с Fancy UILabels . По сути, Крейг Хокенберри создал свой собственный «детектор данных», чтобы он мог вставлять ссылки в метки и многострочный текст. Смотрите этот вопрос: Есть ли способ создания пользовательских UIDataDetectorTypes?

0 голосов
/ 08 мая 2017

Это решение для кликабельной UILabel.Это не для выбора ссылки в тексте.Просто хорошее решение на мой взгляд для кликабельной UILabel вроде UIButton:

#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]];
}
0 голосов
/ 22 мая 2014

Добавив UITapGestureRecognizer к ярлыку, чтобы сделать UIlabel кликабельным.

Перед добавлением метки в Tapgesture, не забудьте включить взаимодействие с пользователем для 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];
0 голосов
/ 04 марта 2013

Я думаю, что вы можете использовать textView и использовать прокрутку. Я сделал то же самое для своего проекта, где мне нужно указать адреса веб-сайтов. просто снимите все, как показано на скриншоте в разделе «прокрутки» в окне инспектора. disable scrolling

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...