UITextView lien appuyez sur reconnaissance est retardée
Dans iOS 7 app, j'ai un UITextView
avec un lien en elle, mais en tapant le lien n'est pas le feu. Il ne répond qu'à un maladroit ", appuyez et maintenez". Je tiens à réagir dès qu'un utilisateur appuie sur elle, comme la façon dont un UIWebView
lien appuyez sur marche. Voici ma configuration:
- (void)viewDidLoad
{
[super viewDidLoad];
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."];
[text addAttribute:NSLinkAttributeName value:@"myurl://tapped" range:NSMakeRange(6, 16)];
self.textView.attributedText = text;
self.textView.editable = NO;
self.textView.delaysContentTouches = NO;
}
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange
{
if ([[URL scheme] isEqualToString:@"myurl"])
{
//Handle tap
return NO;
}
return YES;
}
La Documentation d'Apple pour la shouldInteractWithURL
méthode unis: "L'affichage de texte appelle cette méthode si l'utilisateur appuie ou long-presses de l'adresse URL du lien". Le long de la presse est au travail, mais le robinet ne semble pas fonctionner.
Personne ne sait comment obtenir ce à répondre immédiatement?
- Lien appuyez sur reconnaissance est retardée qui se passe dans iOS9 :((((((
Vous devez vous connecter pour publier un commentaire.
Est le
UITextView
sélectionnable?. Essayez avec:Edit:
Je commence à penser que peut-être un long-presse est la seule façon de faire feu contrairement à ce que apple dit. Cochez cette lien, peut-être que ça va aider.
[self.textView setText:nil]
avant paramètre de l'URL.self.textView.dataDetectorTypes = UIDataDetectorTypeLink;
[self.textView.scrollEnabled:NO];
dataDetectorTypes = UIDataDetectorTypeLink
. Semble comme CCHLinkTextView ne prend pas en charge rapide en tapant l'URL des liens malheureusement.Si vous voulez toujours aller avec un natif
UITextView
, vous pouvez ajouter un robinet de reconnaissance pour votre textview et obtenir les attributs de la chaîne du robinet emplacement. Lorsque vous trouvez un lien, vous pouvez l'ouvrir immédiatement.J'ai écrit un Résumé qui permet de résoudre ce pour iOS 7/8. C'est une légère extension de
UITextView
qui transmet également-[UITextViewDelegate textView:shouldInteractWithURL:inRange:]
et expose l'intérieur du robinet geste de reconnaissance.https://gist.github.com/benjaminbojko/c92ac19fe4db3302bd28
Voici un petit exemple:L'exemple ci-dessous ne fonctionne que sur iOS 8. Voir le résumé ci-dessus pour iOS 7 + 8 support.Ajouter votre robinet de reconnaissance:
Et ajouter votre rappel:
Et swift version:
Appuyez sur reconnaissance:
Rappel:
NSLinkAttributeName
clé deattributes
donne une NSURL, de sorte que le code ci-dessus échoue sur leURLWithString
partietextStylingAtPosition:inDirection:
sur iOS 7. Je suppose qu'il avait à faire avec le textPosition ayant une longueur de 0, et donc attribués chaîne avait pas de caractères pour accueillir toutes les informations sur le lien de. Juste une pensée. En fin de compte, j'ai écrit ce Résumé qui fonctionne pour moi à travers iOS 7 et 8: gist.github.com/benjaminbojko/c92ac19fe4db3302bd28@objc func tappedTextView(tapGesture: UIGestureRecognizer) { let textView = tapGesture.view as! UITextView let tapLocation = tapGesture.location(in: textView) let textPosition = textView.closestPosition(to: tapLocation) let attr = textView.textStyling(at: textPosition!, in: .forward)! if let url: URL = attr[NSAttributedStringKey.link.rawValue] as? URL { UIApplication.shared.open(url, options: [:], completionHandler: nil) } }
Comme nnarayann mentionné, CCHLinkTextView permet d'éviter le problème de retard appuyez sur la reconnaissance. Cette bibliothèque implémente son propre geste de reconnaissance et est maintenant disponible en version 1.0.
Swift 4 solution
isSelectable
esttrue
oufalse
, il fonctionnelet urlString = textView.textStyling(at: textPosition, in: .forward)?[NSAttributedStringKey.link.rawValue] as? URL, urlString == "myurl" else { return }
au Lieu de:let urlString = textView.textStyling(at: textPosition, in: .forward)?[NSAttributedStringKey.link.rawValue] as? String, urlString == "myurl" else { return }
textStyling[NSAttributedStringKey.link.rawValue]
est NSString qui échoue sur le casting de l'URL, vous pouvez créerURL.init(string: urlString)
si nécessaireParfois, il ne fonctionne pas sur le Simulateur iOS ou ne fonctionnent que si vous appuyez sur & maintenez-la enfoncée.
Vous devez le tester sur un périphérique réel.
Et n'oubliez pas de définir
selectable
.Si il n'y a pas un motif impérieux d'utiliser un
UITextView
, comme n'ayant pas d'autre texte affiché, vous pouvez utiliser unUILabel
combiné avec unUITapGestureRecognizer
pour obtenir l'effet que vous recherchez.Sinon, vous pourriez aller avec une réelle
UIWebView
à la place.Avez-vous essayé de réglage
textview.delaysContentTouches = NO;
? Cela pourrait peut-être aider.touchesBegan
& c'est frères etattributesAtIndex
et de vérifier pour laNSLinkAttribute
si elle existe.