Como personalizar o UILabel clicável

O que eu quero:

Em um aplicativo para iPhone, gostaria de mostrar informações em um tableView. Em cada célula, o texto é como: John recentemente escute a música abcdefg.mp3. e, se necessário, o texto pode ter duas linhas.

No texto, a.mp3 deve ser clicável, então quando o usuário tocar na parte abcdefg.mp3 , outra página será invocada. Quando o usuário toca o abcdefg.mp3 , ele também terá alguns efeitos, como tocar um botão.

O que eu faço:

Eu calculo o quadro do texto, e eu uso um UIButton para abcdefg.mp3 .

Meu problema:

Às vezes, o abcdefg.mp3 pode estar em várias linhas , como:

abc está no final da primeira linha

defg.mp3 está na segunda linha.

O que devo fazer neste caso?

Eu já pesquisei sobre: Criar “links” com capacidade de tocar na NSAttributedString de um UILabel? No entanto, acho que não é adequado aqui, pois o texto clicável está todo em uma linha na amostra.

A maneira mais simples é simplesmente adicionar um reconhecedor de gestos à visão atual (seja uma UILabel ou alguma visão personalizada). Para que o reconhecedor de gestos funcione, a exibição deve ser definida como userInteractionEnabled.

Aqui está um exemplo, supondo que sua exibição de label (ou seja o que for) é chamada 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]; 

Neste exemplo, uma mensagem de ação será enviada para self e a mensagem será definida como

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

Isso funciona da mesma forma que ligar qualquer outra subclass do UIControl, como um botão.

Outras notas: não tente adicionar o mesmo reconhecedor de gestos a várias visualizações, isso não funcionará. Não adicione mais do que uma cópia do reconhecedor de gestos a múltiplas visualizações (não as substitui, apenas as empilha e desperdiça memory). Você deve adicionar o reconhecedor de gestos ao criar e configurar inicialmente sua exibição.

Para mais informações, consulte a documentação do UIGestureRecognizer .

Versão rápida:

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

Versão 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) 

Parece semelhante ao que eles realizaram no Twitteriffic com UILabels extravagantes . Basicamente, Craig Hockenberry fez seu próprio “detector de dados” personalizado, para que ele pudesse inserir links dentro de labels e texto de várias linhas. Veja esta pergunta: Existe uma maneira de criar UIDataDetectorTypes personalizados?

Você também pode simplesmente colocar um “botão invisível” acima, usando um botão personalizado sem texto e imagens.

insira a descrição da imagem aqui

Eu acho que você pode usar textView e diable a rolagem. Fiz o mesmo para o meu projeto, onde preciso apontar para endereços de sites. basta desmarcar tudo conforme mostrado na captura de canvas na seção ‘rolagem’ da janela do inspetor. desabilitar a rolagem

Adicionando UITapGestureRecognizer ao label, para tornar o label de UIlabel clicável.

Antes de adicionar o label ao tapgesture, não se esqueça de ativar a interação do usuário para o UIlabel

Aqui está o código de exemplo:

 //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]; 

Esta solução para UILabel clicável. Não é para selecionar o link no texto. Apenas boa solução na minha opinião para UILabel clicável como UIButton:

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