Подтвердить что ты не робот

Как настроить интерактивный интерфейс UILabel

Что я хочу:

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

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

Что я делаю:

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

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

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

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

defg.mp3 находится во второй строке.

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

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

4b9b3361

Ответ 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.

Ответ 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!")
}

Ответ 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, Необычные UILabels. В принципе, Craig Hockenberry создал свой собственный "детектор данных", чтобы он мог вставлять ссылки в ярлыки и многострочный текст. См. Этот вопрос: Есть ли способ создания пользовательских идентификаторов UIDataDetectorTypes?

Ответ 5

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

enter image description here

Ответ 6

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

Ответ 7

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

Прежде чем добавлять ярлык к tapgesture, не забудьте включить userinteraction для 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. Это не для выбранной ссылки в тексте. Просто приятное решение, на мой взгляд, для интерактивного 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]];
}