URL / Phone-clickable UILabel कैसे बनाएं?


116

मैं अपने ऐप पर क्लिक करने योग्य लेबल बनाना चाहता हूं जो मुझे एक सफारी वेबपेज पर ले जाएगा। मैं यह भी चाहता हूं कि उपयोगकर्ता केवल उन पर क्लिक करके संख्याओं को फोन करने में सक्षम हों?

आपकी सलाह के लिए धन्यवाद


जवाबों:


134

आप UITextViewइंस्पेक्टर में लिंक, फोन नंबर और अन्य चीजों के लिए डिटेक्शन का चयन कर सकते हैं ।


2
मेरे पास एक स्व आकार बदलने वाला लेबल है जो पाठ की एन लाइनों को समायोजित कर सकता है। मैं UITextView को लागू किए बिना इस लेबल के लिंक को क्लिक करने योग्य कैसे बना सकता हूं।
13

@bibscy तो आप NSAttributedText का उपयोग कर सकते हैं। को देखो stackoverflow.com/questions/1256887/...
बेसल

95

के UITextViewबजाय का उपयोग करें UILabelऔर यह आपके पाठ को हाइपरलिंक में बदलने के लिए एक संपत्ति है।

उद्देश्य सी:

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

स्विफ्ट:

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

यह स्वचालित रूप से लिंक का पता लगाएगा।

देखें प्रलेखन जानकारी के लिए।


5
यह रंग नीले रंग को दर्शाता है और इसे रेखांकित करता है, लेकिन यह क्लिक करने योग्य बनाता है, कम से कम iOS 7 पर
बेन एच।

1
स्विफ्ट कोड: yourTextView.editable = false; yourTextView.dataDetectorTypes = UIDataDetectorTypes.All;
थियागो एरेगुई जूल

5
सवाल UILabel के बारे में है, UITextView के बारे में नहीं।
स्विफ्ट 2 जेक

28

https://github.com/mattt/TTTAttributedLabel

यह निश्चित रूप से आप की जरूरत है। आप अपने लेबल के लिए विशेषताओं को भी लागू कर सकते हैं, जैसे कि रेखांकन, और उस पर अलग-अलग रंग लागू कर सकते हैं। बस क्लिक करने योग्य url के निर्देशों की जाँच करें।

मुख्य रूप से, आप निम्न की तरह कुछ करते हैं:

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

12

आप एक कस्टम UIButton और सेटटेक्स्ट बना सकते हैं जो आप कभी भी चाहते हैं और उसके साथ एक विधि जोड़ सकते हैं।

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
}

फ़ॉन्ट सेट करना अब इसके द्वारा किया जाता है: button.titleLabel.font = [UIFont systemFontOfSize: size];
लियोन

10

यदि आप चाहते हैं कि इसे UILabel द्वारा संभाला जाए और UITextView को नहीं, तो आप UILabel को उपवर्ग बना सकते हैं, इस प्रकार है:

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)!)
            }
        }
    })

}}

इस उत्तर से कोड का पुन: उपयोग करके यह वर्ग बनाया गया था । इस उत्तर को जांचने के लिए जिम्मेदार स्ट्रिंग्स बनाने के लिए । और यहां आप फोन के यूआरएल बनाने का तरीका जान सकते हैं।


6

इसका उपयोग मैंने इसे बहुत पसंद किया क्योंकि नीले रंग के साथ विशेष रूप से पाठ के लिए लिंक बनाता है न केवल पूरे लेबल पाठ पर: FRHyperLabel

उपयोग की शर्तों पर चालाकी से हाइपरलिंक लागू करना

करने के लिए:

  1. ऊपर दिए गए लिंक और कॉपी से डाउनलोड करें FRHyperLabel.h, FRHyperLabel.mअपने प्रोजेक्ट में।

  2. छवि में दिखाए अनुसार इंस्पेक्टर की पहचान करने के लिए UILabelअपने में ड्रॉप ड्रैग करें Storyboardऔर कस्टम वर्ग के नाम को परिभाषित FRHyperLabelकरें।

यहां छवि विवरण दर्ज करें

  1. स्टोरीबोर्ड से अपने UILabel को अपनी viewController.h फ़ाइल से कनेक्ट करें

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

  1. अब अपने viewController.m फ़ाइल में निम्न कोड जोड़ें।

`एनएसएसट्रिंग * स्ट्रिंग = @" अपलोड करके मैं उपयोग की शर्तों से सहमत हूं "; NS मंदारिन * विशेषताएँ = @ {NSFontAttributeName: [UIFont पसंदीदाफ़ोरफ़ॉरटेक्स्टाइल: 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. और इसे चलाते हैं।

6

UILabel के बजाय UITextView का उपयोग करें और इसमें आपके टेक्स्ट को हाइपरलिंक में बदलने का गुण है

स्विफ्ट कोड:

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

4
टेक्स्ट व्यू के बजाय UILabel में उपयोग करने का प्रश्न। धन्यवाद।
स्विफ्ट 2 जीके

0
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

क्यों नहीं बस NSMutableAttributedString का उपयोग करें ?

let attributedString = NSMutableAttributedString(string: "Want to learn iOS? Just visit developer.apple.com!")
        attributedString.addAttribute(.link, value: "https://developer.apple.com", range: NSRange(location: 30, length: 50))

        myView.attributedText = attributedString

आप अधिक विवरण यहां पा सकते हैं


मैंने सिर्फ आज कोशिश की कि यूआईबेल से कॉल करें और ऊपर कोड काम नहीं करता है। मैंने dev.appl.com को tel: // 1234567 से बदल दिया है । हो सकता है कि इस उत्तर को अपडेट किया जाए।
प्रतिमा सोमैया

-1

स्विफ्ट 4.2, एक्सकोड 9.3 संस्करण

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(self.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;
            }

        }
    }

    @objc 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(NSAttributedStringKey.link, 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)!)
                }
            }
        })

    }}

-3

UIButton का उपयोग करके 4.0 संभव समाधान स्विफ्ट

     phoneButton = UIButton(frame: CGRect(x: view.frame.width * 0, y: view.frame.height * 0.1, width: view.frame.width * 1, height: view.frame.height * 0.05))
     phoneButton.setTitle("333-333-3333", for: .normal )
     phoneButton.setTitleColor(UIColor(red: 0 / 255, green: 0 / 255, blue: 238 / 255, alpha: 1.0), for: .normal)
     phoneButton.addTarget(self, action: #selector(self.callPhone), for: .touchUpInside )

     @objc func callPhone(){

         UIApplication.shared.open(URL(string:"tel://3333333333")!, options: [:] , completionHandler: nil)


    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.