300 votes

Créer des "liens" pouvant être effleurés dans la NSAttributedString d'une UILabel ?

Je cherche depuis des heures mais je n'ai pas réussi. Je ne sais probablement même pas ce que je devrais chercher.

De nombreuses applications contiennent du texte et dans ce texte se trouvent des hyperliens web en rectangle arrondi. Lorsque je clique sur eux UIWebView s'ouvre. Ce qui m'intrigue, c'est qu'ils ont souvent des liens personnalisés, par exemple si les mots commencent par #, ils sont également cliquables et l'application répond en ouvrant une autre vue. Comment puis-je faire cela ? Est-ce possible avec UILabel ou dois-je UITextView ou autre chose ?

0 votes

Voir : stackoverflow.com/questions/50505334/ pour une Swift 4 solution. Elle utilise UITextView mais le fait se comporter comme un UILabel . J'ai essayé les solutions proposées ici, mais je n'ai pas réussi à obtenir une détection précise des liens.

0 votes

43voto

Lope Points 1145

FancyLabel est exactement ce dont j'avais besoin :)

32voto

Iggy Points 1277

L'UIButtonTypeCustom est une étiquette cliquable si vous ne lui attribuez pas d'images.

31 votes

Seulement si tout le texte est cliquable et qu'il n'y a qu'un seul lien.

24voto

Charles Gamble Points 171

UITextView supporte les détecteurs de données dans OS3.0, alors que UILabel ne le fait pas.

Si vous activez les détecteurs de données sur le UITextView et que votre texte contient des URL, des numéros de téléphone, etc., ils apparaîtront comme des liens.

1 votes

Oui, je suis au courant, mais j'ai également besoin d'une détection personnalisée, par exemple #some_word, comme indiqué dans ma question.

0 votes

@Lope Vous pouvez toujours faire cela, il suffit de leur attribuer un url-scheme personnalisé comme hashtag:// ou autre, puis utilisez textView(_:shouldInteractWith:in:interaction:) pour le détecter. Voir la réponse ci-dessous : stackoverflow.com/a/34014655/1161906

6voto

Sannny Points 310

Voici un exemple de code permettant d'établir un lien hypertexte avec UILabel : Source : http://sickprogrammersarea.blogspot.in/2014/03/adding-links-to-uilabel.html

#import "ViewController.h"
#import "TTTAttributedLabel.h"

@interface ViewController ()
@end

@implementation ViewController
{
    UITextField *loc;
    TTTAttributedLabel *data;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(5, 20, 80, 25) ];
    [lbl setText:@"Text:"];
    [lbl setFont:[UIFont fontWithName:@"Verdana" size:16]];
    [lbl setTextColor:[UIColor grayColor]];
    loc=[[UITextField alloc] initWithFrame:CGRectMake(4, 20, 300, 30)];
    //loc.backgroundColor = [UIColor grayColor];
    loc.borderStyle=UITextBorderStyleRoundedRect;
    loc.clearButtonMode=UITextFieldViewModeWhileEditing;
    //[loc setText:@"Enter Location"];
    loc.clearsOnInsertion = YES;
    loc.leftView=lbl;
    loc.leftViewMode=UITextFieldViewModeAlways;
    [loc setDelegate:self];
    [self.view addSubview:loc];
    [loc setRightViewMode:UITextFieldViewModeAlways];
    CGRect frameimg = CGRectMake(110, 70, 70,30);
    UIButton *srchButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    srchButton.frame=frameimg;
    [srchButton setTitle:@"Go" forState:UIControlStateNormal];
    [srchButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    srchButton.backgroundColor=[UIColor clearColor];
    [srchButton addTarget:self action:@selector(go:) forControlEvents:UIControlEventTouchDown];
    [self.view addSubview:srchButton];
    data = [[TTTAttributedLabel alloc] initWithFrame:CGRectMake(5, 120,self.view.frame.size.width,200) ];
    [data setFont:[UIFont fontWithName:@"Verdana" size:16]];
    [data setTextColor:[UIColor blackColor]];
    data.numberOfLines=0;
    data.delegate = self;
    data.enabledTextCheckingTypes=NSTextCheckingTypeLink|NSTextCheckingTypePhoneNumber;
    [self.view addSubview:data];
}
- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithURL:(NSURL *)url
{
    NSString *val=[[NSString alloc]initWithFormat:@"%@",url];
    if ([[url scheme] hasPrefix:@"mailto"]) {
              NSLog(@" mail URL Selected : %@",url);
        MFMailComposeViewController *comp=[[MFMailComposeViewController alloc]init];
        [comp setMailComposeDelegate:self];
        if([MFMailComposeViewController canSendMail])
        {
            NSString *recp=[[val substringToIndex:[val length]] substringFromIndex:7];
            NSLog(@"Recept : %@",recp);
            [comp setToRecipients:[NSArray arrayWithObjects:recp, nil]];
            [comp setSubject:@"From my app"];
            [comp setMessageBody:@"Hello bro" isHTML:NO];
            [comp setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
            [self presentViewController:comp animated:YES completion:nil];
        }
    }
    else{
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:val]];
    }
}
-(void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error{
    if(error)
    {
        UIAlertView *alrt=[[UIAlertView alloc]initWithTitle:@"Erorr" message:@"Some error occureed" delegate:nil cancelButtonTitle:@"" otherButtonTitles:nil, nil];
        [alrt show];
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    else{
        [self dismissViewControllerAnimated:YES completion:nil];
    }
}

- (void)attributedLabel:(TTTAttributedLabel *)label didSelectLinkWithPhoneNumber:(NSString *)phoneNumber
{
    NSLog(@"Phone Number Selected : %@",phoneNumber);
    UIDevice *device = [UIDevice currentDevice];
    if ([[device model] isEqualToString:@"iPhone"] ) {
        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel:%@",phoneNumber]]];
    } else {
        UIAlertView *Notpermitted=[[UIAlertView alloc] initWithTitle:@"Alert" message:@"Your device doesn't support this feature." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [Notpermitted show];
    }
}
-(void)go:(id)sender
{
    [data setText:loc.text];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"Reached");
    [loc resignFirstResponder];
}

5voto

zpesk Points 3049

Vous pourriez vouloir jeter un coup d'œil au projet open sourced three20 de Joe Hewitt. Il propose un exemple de création d'étiquettes personnalisées contenant des hyperliens.

projet three20

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X