কীভাবে ইউআরএল / ফোন-ক্লিকযোগ্য UILabel করবেন?


116

আমি আমার অ্যাপটিতে ক্লিকযোগ্য লেবেল তৈরি করতে চাই যা আমাকে সাফারি ওয়েবপৃষ্ঠায় নিয়ে যায়। আমিও চাই যে ব্যবহারকারীরা কেবল তাদের উপর ক্লিক করে নম্বরগুলি ফোন করতে সক্ষম হন?

আপনার পরামর্শের জন্য ধন্যবাদ


উত্তর:


134

আপনি UITextViewপরিদর্শকের লিঙ্ক, ফোন নম্বর এবং অন্যান্য জিনিসের জন্য একটি নির্বাচন করতে পারেন এবং নির্বাচন করতে পারেন ।


2
আমার একটি স্ব-আকার পরিবর্তনকারী লেবেল রয়েছে যা পাঠ্যের এন লাইনের সাথে সামঞ্জস্য করতে পারে। ইউআইটিেক্সটভিউ বাস্তবায়ন না করে কীভাবে আমি এই লেবেলের লিঙ্কগুলিকে ক্লিকযোগ্য করে তুলতে পারি।
বাইবেস

@ বিবিসিটি তারপরে আপনি এনএসএট্রিবিউটেড টেক্সট ব্যবহার করতে পারেন। স্ট্যাকওভারফ্লো
বাসেল

95

UITextViewপরিবর্তে ব্যবহার করুন UILabelএবং এটিতে আপনার পাঠ্যকে হাইপারলিঙ্কে রূপান্তর করার জন্য একটি সম্পত্তি রয়েছে।

উদ্দেশ্য গ:

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

সুইফট:

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

এটি স্বয়ংক্রিয়ভাবে লিঙ্কগুলি সনাক্ত করবে।

বিশদ জন্য ডকুমেন্টেশন দেখুন ।


5
এই লিঙ্কটি নীল রঙ করে এবং এটি আন্ডারলাইন করে তবে কমপক্ষে আইওএস 7.
বেন এইচ

1
সুইফট কোড: আপনারটেক্সটভিউ.ডেবলযোগ্য = মিথ্যা; yourTextView.dataDetectorTypes = UIDataDetectorTypees.All;
থিয়াগো অ্যারেগুয়ে

5
প্রশ্নটি ইউআইএলবেল সম্পর্কে, ইউআইটিেক্সটভিউ নয়।
swift2geek

28

https://github.com/mattt/TTTAttributedLabel

এটি অবশ্যই আপনার প্রয়োজন। আপনি আন্ডারলাইন এর মতো আপনার লেবেলের জন্য বৈশিষ্ট্যগুলিও প্রয়োগ করতে পারেন এবং এতে বিভিন্ন রঙ প্রয়োগ করতে পারেন। ক্লিকযোগ্য ইউআরএলগুলির জন্য কেবল নির্দেশাবলী পরীক্ষা করুন।

মূলত, আপনি নিম্নলিখিতগুলির মতো কিছু করেন:

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
}

হরফ সেট করার কাজটি এখন সম্পন্ন করে: বাটন.titleLabel.font = [ইউআইএফএন্ট সিস্টেমফন্টঅফসাইজ: আকার];
লিওন

10

আপনি যদি এটি ইউআইএলবেল দ্বারা পরিচালিত করতে চান এবং ইউআইটিেক্সটভিউ নয়, আপনি এটির মতো ইউআইলাবেল সাবক্লাস তৈরি করতে পারেন:

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. আপনার ইউআইএলবেল স্টোরিবোর্ড থেকে আপনার ভিউকন্ট্রোল.আর ফাইলটিতে সংযুক্ত করুন

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

  1. এখন আপনার ভিউকন্ট্রোল.আরমি ফাইলটিতে নিম্নলিখিত কোড যুক্ত করুন।

`এনএসএসস্ট্রিং * স্ট্রিং = @" আপলোড করে আমি ব্যবহারের শর্তাবলীতে সম্মতি জানাই "; এনএসডেটরিয় * বৈশিষ্ট্য = @ {এনএসফন্টএট্রিবিউটনেম: [ইউআইএফএন্টের পছন্দেরফন্টফেক্সটেক্সটাইল: ইউআইফন্টটেক্সটস্টাইলহাইডলাইন]};

_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

ইউআইএলবেলের পরিবর্তে ইউআইটিেক্সটভিউ ব্যবহার করুন এবং এটি আপনার পাঠ্যকে হাইপারলিঙ্কে রূপান্তর করার জন্য একটি সম্পত্তি রয়েছে

সুইফট কোড:

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

4
টেক্সটভিউয়ের চেয়ে ইউআইএলবেলে কীভাবে ব্যবহার করবেন তা প্রশ্ন। ধন্যবাদ।
swift2geek

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

কেন শুধু এনএসমিটেবলঅ্যাট্রিবিউড স্ট্রিং ব্যবহার করবেন না ?

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 টেল: // 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)


    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.