সাধারণভাবে, যদি আমরা ইউআইএলবেল দ্বারা প্রদর্শিত পাঠ্যে ক্লিকযোগ্য লিঙ্কটি রাখতে চাই, আমাদের দুটি স্বতন্ত্র কাজ সমাধান করতে হবে:
- লিঙ্কের মতো দেখতে পাঠ্যের কোনও অংশের চেহারা পরিবর্তন করা
- লিঙ্কটিতে স্পর্শগুলি সনাক্ত করা এবং পরিচালনা করা (একটি URL খোলার একটি বিশেষ ঘটনা)
প্রথমটি সহজ। আইওএস 6 থেকে শুরু করে ইউআইএলবেল বিশিষ্ট স্ট্রিংগুলির প্রদর্শন সমর্থন করে। আপনাকে যা করতে হবে তা হ'ল এনএসমেটেবলঅ্যাট্রিবিউটেড স্ট্রিংয়ের একটি উদাহরণ তৈরি এবং কনফিগার করা:
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:@"String with a link" attributes:nil];
NSRange linkRange = NSMakeRange(14, 4); // for the word "link" in the string above
NSDictionary *linkAttributes = @{ NSForegroundColorAttributeName : [UIColor colorWithRed:0.05 green:0.4 blue:0.65 alpha:1.0],
NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle) };
[attributedString setAttributes:linkAttributes range:linkRange];
// Assign attributedText to UILabel
label.attributedText = attributedString;
এটাই! উপরের কোডটি ইউআইএলবেলকে একটি লিঙ্ক সহ স্ট্রিং প্রদর্শন করতে সক্ষম করে
এখন আমাদের এই লিঙ্কটির ছোঁয়া সনাক্ত করা উচিত। ইউআইএলবেলের মধ্যে সমস্ত ট্যাপগুলি ধরা এবং নলের অবস্থানটি লিঙ্কটির যথেষ্ট কাছে ছিল কিনা তা খুঁজে বের করার ধারণাটি। ছোঁয়া ধরতে আমরা লেবেলে টোকা অঙ্গভঙ্গি সনাক্তকারী যুক্ত করতে পারি। লেবেলটির জন্য ব্যবহারকারীকে সক্রিয় করতে নিশ্চিত করুন, এটি ডিফল্টরূপে বন্ধ করা আছে:
label.userInteractionEnabled = YES;
[label addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapOnLabel:)]];
এখন সর্বাধিক পরিশীলিত স্টাফ: লিংকের অন্য কোনও অংশে লিঙ্কটি প্রদর্শিত হয়েছে এবং সেখানে ট্যাপ ছিল কিনা তা সন্ধান করুন। যদি আমাদের একক-রেখাযুক্ত ইউআইএলবেল থাকে তবে লিংকটি প্রদর্শিত হয় এমন জায়গার সীমানা হার্ডকোড করে এই কাজটি তুলনামূলকভাবে সহজ সমাধান করা যেতে পারে তবে আসুন এই সমস্যাটি আরও মার্চিকভাবে এবং সাধারণ ক্ষেত্রে সমাধান করুন - লিঙ্ক বিন্যাস সম্পর্কে প্রাথমিক জ্ঞান ছাড়াই মাল্টলাইন ইউআইএলবেল।
পদ্ধতির একটি হ'ল আইওএস 7 তে প্রবর্তিত টেক্সট কিট এপিআইয়ের ক্ষমতা ব্যবহার করা:
// Create instances of NSLayoutManager, NSTextContainer and NSTextStorage
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:CGSizeZero];
NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString];
// Configure layoutManager and textStorage
[layoutManager addTextContainer:textContainer];
[textStorage addLayoutManager:layoutManager];
// Configure textContainer
textContainer.lineFragmentPadding = 0.0;
textContainer.lineBreakMode = label.lineBreakMode;
textContainer.maximumNumberOfLines = label.numberOfLines;
আপনার শ্রেণীর বৈশিষ্ট্যগুলিতে NSLayoutManager, NSTextContainer এবং NSTextStorage এর তৈরি এবং কনফিগার করা দৃষ্টান্তগুলি সংরক্ষণ করুন (সম্ভবত ইউআইভিউকন্ট্রোলারের বংশধর) - আমাদের অন্যান্য পদ্ধতিতে তাদের প্রয়োজন হবে।
এখন, প্রতিবার লেবেল তার ফ্রেম পরিবর্তন করে, পাঠ্য কনটেনারের আকার আপডেট করে:
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
self.textContainer.size = self.label.bounds.size;
}
এবং অবশেষে, লিঙ্কটিতে আলতো চাপছিল কিনা তা সনাক্ত করুন:
- (void)handleTapOnLabel:(UITapGestureRecognizer *)tapGesture
{
CGPoint locationOfTouchInLabel = [tapGesture locationInView:tapGesture.view];
CGSize labelSize = tapGesture.view.bounds.size;
CGRect textBoundingBox = [self.layoutManager usedRectForTextContainer:self.textContainer];
CGPoint textContainerOffset = CGPointMake((labelSize.width - textBoundingBox.size.width) * 0.5 - textBoundingBox.origin.x,
(labelSize.height - textBoundingBox.size.height) * 0.5 - textBoundingBox.origin.y);
CGPoint locationOfTouchInTextContainer = CGPointMake(locationOfTouchInLabel.x - textContainerOffset.x,
locationOfTouchInLabel.y - textContainerOffset.y);
NSInteger indexOfCharacter = [self.layoutManager characterIndexForPoint:locationOfTouchInTextContainer
inTextContainer:self.textContainer
fractionOfDistanceBetweenInsertionPoints:nil];
NSRange linkRange = NSMakeRange(14, 4); // it's better to save the range somewhere when it was originally used for marking link in attributed string
if (NSLocationInRange(indexOfCharacter, linkRange)) {
// Open an URL, or handle the tap on the link in any other way
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://stackoverflow.com/"]];
}
}
Swift 4এটি ব্যবহার করেUITextViewতবে এটির মতো আচরণ করেUILabel। আমি এখানে সমাধানগুলি চেষ্টা করেছি এবং সঠিক লিঙ্ক সনাক্তকরণে ব্যর্থ হয়েছি।