web-dev-qa-db-fra.com

Comment personnaliser UILabel cliquable

Ce que je veux:

Dans une application iPhone, j'aimerais afficher des informations dans une tableView. Dans chaque cellule, le texte est le suivant: John a récemment écouté de la musique abcdefg.mp3. et si nécessaire, le texte peut avoir deux lignes.

Dans le texte, a.mp3 doit être cliquable, donc lorsque l'utilisateur touche la partie abcdefg.mp3 , une autre page sera invoquée. Lorsque l'utilisateur touche abcdefg.mp3 , cela aura également des effets, tout comme toucher un bouton.

Ce que je fais:

Je calcule le cadre du texte et j'utilise un UIButton pour abcdefg.mp3 .

Mon problème:

Parfois abcdefg.mp3 peut être en multiligne, comme:

abc est à la fin de la première ligne

defg.mp3 est en deuxième ligne.

Que dois-je faire dans ce cas?

J'ai déjà fait des recherches sur: Créer des "liens" utilisables dans la chaîne NSAttributedString d'un UILabel? Cependant, je pense que cela ne convient pas ici car le texte cliquable est tout sur une seule ligne dans l'exemple.

29
scorpiozj

Le moyen le plus simple consiste à simplement ajouter un identificateur de gestes à la vue réelle (que ce soit une étiquette UIL ou une vue personnalisée de votre choix). Pour que la reconnaissance des mouvements fonctionne, la vue doit être définie userInteractionEnabled.

Voici un exemple, en supposant que votre vue d'étiquette (ou quoi que ce soit) s'appelle 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];

Dans cet exemple, un message d'action sera envoyé à self et le message sera défini comme

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

Cela fonctionne de la même manière que le câblage de toute autre sous-classe UIControl, comme un bouton.

Autres notes: n'essayez pas d'ajouter le même identificateur de gestes à plusieurs vues, cela ne fonctionnera pas. N'ajoutez pas plus d'une copie de la reconnaissance des gestes à plusieurs vues (elle ne les remplace pas, elle les empile et gaspille de la mémoire). Vous devez ajouter la reconnaissance des gestes lors de la création et de la configuration initiales de votre vue.

Pour plus d'informations, consultez la documentation de IGestureRecognizer .

118
Jason Coco

Version 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!")
}
8
Esqarrouth

Version 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)
2
Bill Chan

Cela ressemble à ce qu'ils ont accompli dans Twitteriffic avec Fancy UILabels . Fondamentalement, Craig Hockenberry a créé son propre "détecteur de données" personnalisé, afin de pouvoir insérer des liens dans les étiquettes et le texte multiligne. Voir cette question: Existe-t-il un moyen de créer des UIDataDetectorTypes personnalisés?

1
Reed Olsen

Vous pouvez également simplement mettre un "bouton invisible" au-dessus, en utilisant un bouton personnalisé sans texte ni images.

enter image description here

1
Chris Conway

Cette solution pour UILabel cliquable. Ce n'est pas pour sélectionner le lien dans le texte. Juste une bonne solution à mon avis pour UILabel cliquable comme 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
Alex P

En ajoutant UITapGestureRecognizer à l'étiquette, pour rendre UIlabel cliquable.

Avant d'ajouter l'étiquette à tapgesture, n'oubliez pas d'activer l'interaction utilisateur pour UIlabel

Voici l exemple de code:

//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
ashok

Je pense que vous pouvez utiliser textView et effectuer le défilement. J'ai fait de même pour mon projet où je dois pointer vers des adresses de sites Web. il suffit de tout décocher comme indiqué dans la capture d'écran dans la section 'vue défilante' de la fenêtre d'inspection. disable scrolling

0
Alix