wake-up-neo.net

Wie mache ich URL/Telefon-anklickbare UILabel?

Ich möchte in meiner App ein anklickbares Etikett erstellen, das mich zu einer Safari-Webseite führt. Ich möchte auch, dass der Benutzer die Nummern nur durch Anklicken anrufen kann. 

Danke für deine Ratschläge

97
Rob

Sie können eine UITextView verwenden und im Inspektor Erkennung für Links, Telefonnummern und andere Elemente auswählen.

121
Basel

Verwenden Sie UITextView anstelle von UILabel und es hat eine Eigenschaft, um Ihren Text in einen Hyperlink zu konvertieren.

Ziel c:

yourTextView.editable = NO;
yourTextView.dataDetectorTypes = UIDataDetectorTypeAll;

Schnell:

yourTextView.editable = false; 
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All;

Dadurch werden Links automatisch erkannt.

Siehe die Dokumentation für Details.

92

https://github.com/mattt/TTTAttributedLabel

Das ist definitiv was du brauchst. Sie können auch Attribute für Ihr Label anwenden, z. B. Unterstrichen, und verschiedene Farben anwenden. Überprüfen Sie einfach die Anweisungen für anklickbare URLs.

Hauptsächlich machst du so etwas wie das Folgende:

NSRange range = [label.text rangeOfString:@"me"];
[label addLinkToURL:[NSURL URLWithString:@"http://github.com/mattt/"] withRange:range]; // Embedding a custom link in a substring
27
Ramy Kfoury

Sie können UIButton und SetText nach Ihren Wünschen erstellen und Methoden hinzufügen.

    UIButton *sampleButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [sampleButton setFrame:CGRectMake(kLeftMargin, 10, self.view.bounds.size.width - kLeftMargin - kRightMargin, 52)];
    [sampleButton setTitle:@"URL Text" forState:UIControlStateNormal];
    [sampleButton setFont:[UIFont boldSystemFontOfSize:20]];

    [sampleButton addTarget:self action:@selector(buttonPressed) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:sampleButton];

-(void)buttonPressed:(id)sender{
 // open url

}
12
Rohit Dhawan

Verwenden Sie UITextView anstelle von UILabel, und es verfügt über eine Eigenschaft, um Ihren Text in einen Hyperlink zu konvertieren

SWIFT-Code:

yourTextView.editable = false
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.PhoneNumber
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.Link
7
Thiago Arreguy

Wenn Sie möchten, dass dies von UILabel und nicht von UITextView gehandhabt wird, können Sie eine UILabel-Unterklasse wie diese erstellen:

class LinkedLabel: UILabel {

fileprivate let layoutManager = NSLayoutManager()
fileprivate let textContainer = NSTextContainer(size: CGSize.zero)
fileprivate var textStorage: NSTextStorage?


override init(frame aRect:CGRect){
    super.init(frame: aRect)
    self.initialize()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.initialize()
}

func initialize(){

    let tap = UITapGestureRecognizer(target: self, action: #selector(LinkedLabel.handleTapOnLabel))
    self.isUserInteractionEnabled = true
    self.addGestureRecognizer(tap)
}

override var attributedText: NSAttributedString?{
    didSet{
        if let _attributedText = attributedText{
            self.textStorage = NSTextStorage(attributedString: _attributedText)

            self.layoutManager.addTextContainer(self.textContainer)
            self.textStorage?.addLayoutManager(self.layoutManager)

            self.textContainer.lineFragmentPadding = 0.0;
            self.textContainer.lineBreakMode = self.lineBreakMode;
            self.textContainer.maximumNumberOfLines = self.numberOfLines;
        }

    }
}

func handleTapOnLabel(tapGesture:UITapGestureRecognizer){

    let locationOfTouchInLabel = tapGesture.location(in: tapGesture.view)
    let labelSize = tapGesture.view?.bounds.size
    let textBoundingBox = self.layoutManager.usedRect(for: self.textContainer)
    let textContainerOffset = CGPoint(x: ((labelSize?.width)! - textBoundingBox.size.width) * 0.5 - textBoundingBox.Origin.x, y: ((labelSize?.height)! - textBoundingBox.size.height) * 0.5 - textBoundingBox.Origin.y)

    let locationOfTouchInTextContainer = CGPoint(x: locationOfTouchInLabel.x - textContainerOffset.x, y: locationOfTouchInLabel.y - textContainerOffset.y)
    let indexOfCharacter = self.layoutManager.characterIndex(for: locationOfTouchInTextContainer, in: self.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)


    self.attributedText?.enumerateAttribute(NSLinkAttributeName, in: NSMakeRange(0, (self.attributedText?.length)!), options: NSAttributedString.EnumerationOptions(rawValue: UInt(0)), using:{
        (attrs: Any?, range: NSRange, stop: UnsafeMutablePointer<ObjCBool>) in

        if NSLocationInRange(indexOfCharacter, range){
            if let _attrs = attrs{

                UIApplication.shared.openURL(URL(string: _attrs as! String)!)
            }
        }
    })

}}

Diese Klasse wurde durch Wiederverwenden von Code aus dieser Antwort erstellt. Um zugeordnete Zeichenfolgen zu erstellen, überprüfen Sie diese Antwort . Und hier finden Sie, wie Sie Telefon-URLs erstellen.

7
Bojan Bozovic

Verwenden Sie dieses, das ich es so sehr mochte, da Verbindung mit blauer Farbe zu bestimmtem Text nicht auf ganzem Etikettentext herstellt: FRHyperLabel

Smartly applying hyperlink on Terms of Use

Machen:

  1. Laden Sie den obigen Link herunter und kopieren Sie FRHyperLabel.h, FRHyperLabel.m In Ihr Projekt.

  2. Ziehen Sie UILabel in Ihr Storyboard und definieren Sie den benutzerdefinierten Klassennamen zu FRHyperLabel im Identifizierungsinspektor, wie in der Abbildung dargestellt.

enter image description here

  1. Verbinden Sie Ihr UILabel vom Storyboard mit Ihrer viewController.h-Datei

@property (weak, nonatomic) IBOutlet FRHyperLabel *label;

  1. Fügen Sie nun in Ihrer viewController.m-Datei den folgenden Code hinzu.

`NSString * string = @" Durch das Hochladen stimme ich den Nutzungsbedingungen zu "; NSDictionary * attributes = @ {NSFontAttributeName: [UIFont preferredFontForTextStyle: UIFontTextStyleHeadline]};

_label.attributedText = [[NSAttributedString alloc]initWithString:string attributes:attributes];
[_label setFont:[_label.font fontWithSize:13.0]];

[_label setLinkForSubstring:@"Terms of Use" withLinkHandler:^(FRHyperLabel *label, NSString *substring){
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://www.google.com"]];
}];`
  1. Und lass es laufen.
6
karan
extension UITapGestureRecognizer {

    func didTapAttributedTextInLabel(label: UILabel, inRange targetRange: NSRange) -> Bool {

        let layoutManager = NSLayoutManager()
        let textContainer = NSTextContainer(size: CGSize.zero)
        let textStorage = NSTextStorage(attributedString: label.attributedText!)

        // Configure layoutManager and textStorage
        layoutManager.addTextContainer(textContainer)
        textStorage.addLayoutManager(layoutManager)

        // Configure textContainer
        textContainer.lineFragmentPadding = 0.0
        textContainer.lineBreakMode = label.lineBreakMode
        textContainer.maximumNumberOfLines = label.numberOfLines
        textContainer.size = label.bounds.size

        // main code
        let locationOfTouchInLabel = self.location(in: label)

        let indexOfCharacter = layoutManager.characterIndex(for: locationOfTouchInLabel, in: textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
        let indexOfCharacterRange = NSRange(location: indexOfCharacter, length: 1)
        let indexOfCharacterRect = layoutManager.boundingRect(forGlyphRange: indexOfCharacterRange, in: textContainer)
        let deltaOffsetCharacter = indexOfCharacterRect.Origin.x + indexOfCharacterRect.size.width

        if locationOfTouchInLabel.x > deltaOffsetCharacter {
            return false
        } else {
            return NSLocationInRange(indexOfCharacter, targetRange)
        }
    }
}
0
Harman