উত্তর:
আপনি UITextView
পরিদর্শকের লিঙ্ক, ফোন নম্বর এবং অন্যান্য জিনিসের জন্য একটি নির্বাচন করতে পারেন এবং নির্বাচন করতে পারেন ।
UITextView
পরিবর্তে ব্যবহার করুন UILabel
এবং এটিতে আপনার পাঠ্যকে হাইপারলিঙ্কে রূপান্তর করার জন্য একটি সম্পত্তি রয়েছে।
yourTextView.editable = NO;
yourTextView.dataDetectorTypes = UIDataDetectorTypeAll;
yourTextView.editable = false;
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All;
এটি স্বয়ংক্রিয়ভাবে লিঙ্কগুলি সনাক্ত করবে।
বিশদ জন্য ডকুমেন্টেশন দেখুন ।
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
আপনি একটি কাস্টম 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
}
আপনি যদি এটি ইউআইএলবেল দ্বারা পরিচালিত করতে চান এবং ইউআইটিেক্সটভিউ নয়, আপনি এটির মতো ইউআইলাবেল সাবক্লাস তৈরি করতে পারেন:
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)!)
}
}
})
}}
এই উত্তরটি থেকে কোডটি পুনরায় ব্যবহার করে এই শ্রেণী তৈরি করা হয়েছিল । গুণিত স্ট্রিংগুলি করার জন্য এই উত্তরটি পরীক্ষা করে দেখুন । এবং এখানে আপনি কীভাবে ফোন ইউআরএল তৈরি করবেন তা খুঁজে পেতে পারেন।
এটি ব্যবহার করে আমি এটি এতটাই পছন্দ করেছি যেহেতু কেবলমাত্র পুরো লেবেল পাঠ্যেই নয় নির্দিষ্ট পাঠ্যের সাথে নীল রঙের সাথে লিঙ্ক তৈরি করা হয়েছে: FRHyperLabel
করতে:
উপরের লিঙ্কটি এবং কপি থেকে ডাউনলোড FRHyperLabel.h
, FRHyperLabel.m
আপনার প্রকল্পের জন্য।
UILabel
আপনার ড্রপ টানুন Storyboard
এবং ইমেজটিতে FRHyperLabel
প্রদর্শিত ইন্সপেক্টরকে সনাক্ত করতে কাস্টম শ্রেণীর নাম সংজ্ঞায়িত করুন ।
@property (weak, nonatomic) IBOutlet FRHyperLabel *label;
`এনএসএসস্ট্রিং * স্ট্রিং = @" আপলোড করে আমি ব্যবহারের শর্তাবলীতে সম্মতি জানাই "; এনএসডেটরিয় * বৈশিষ্ট্য = @ {এনএসফন্টএট্রিবিউটনেম: [ইউআইএফএন্টের পছন্দেরফন্টফেক্সটেক্সটাইল: ইউআইফন্টটেক্সটস্টাইলহাইডলাইন]};
_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"]];
}];`
ইউআইএলবেলের পরিবর্তে ইউআইটিেক্সটভিউ ব্যবহার করুন এবং এটি আপনার পাঠ্যকে হাইপারলিঙ্কে রূপান্তর করার জন্য একটি সম্পত্তি রয়েছে
সুইফট কোড:
yourTextView.editable = false
yourTextView.dataDetectorTypes = UIDataDetectorTypes.All
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.PhoneNumber
//or
yourTextView.dataDetectorTypes = UIDataDetectorTypes.Link
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)
}
}
}
কেন শুধু এনএসমিটেবলঅ্যাট্রিবিউড স্ট্রিং ব্যবহার করবেন না ?
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
আপনি এখানে আরও বিশদ জানতে পারেন
সুইফট 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)!)
}
}
})
}}
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)
}