Как настроить интерактивный интерфейс UILabel
Что я хочу:
В приложении iPhone я хотел бы показать информацию в tableView.
В каждой ячейке текст выглядит так: Джон недавно прослушивает музыку abcdefg.mp3.
и при необходимости текст может иметь две строки.
В тексте a.mp3 следует кликать, поэтому, когда пользователь коснется части abcdefg.mp3, будет вызываться другая страница. Когда пользователь коснется abcdefg.mp3, он также будет иметь некоторые эффекты, как прикосновение к кнопке.
Что я делаю:
Я вычисляю кадр текста, и я использую UIButton для abcdefg.mp3.
Моя проблема:
Иногда abcdefg.mp3 может быть в многострочном формате, например:
abc находится в конце первой строки
defg.mp3 находится во второй строке.
Что мне делать в этом случае?
Я уже искал: Создать привязку к каналам "ссылки" в NSAttributedString 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.
Ответ 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]];
}