প্রথমত, এটি লক্ষ করা খুব গুরুত্বপূর্ণ, যে পাঠ্যটি কীভাবে রেন্ডার করা হয় তা আসে ইউআইটিেক্সটভিউ এবং ইউআইএলবেলের মধ্যে একটি বড় পার্থক্য রয়েছে is ইউআইটিেক্সটভিউয়ের সমস্ত সীমানায় কেবল ইনসেট নেই, তবে এর অভ্যন্তরের পাঠ্য বিন্যাসটিও কিছুটা আলাদা।
সুতরাং, sizeWithFont:
ইউআইটিেক্সটভিউতে যাওয়ার একটি খারাপ উপায়।
পরিবর্তে UITextView
নিজেই একটি ফাংশন নামে পরিচিত sizeThatFits:
যা আপনাকে UITextView
নির্দিষ্ট করতে পারে এমন একটি আবদ্ধ বাক্সের অভ্যন্তরের সমস্ত সামগ্রী প্রদর্শন করার জন্য প্রয়োজনীয় ক্ষুদ্রতম আকারটি ফিরিয়ে দেবে ।
নিম্নলিখিত আইওএস 7 এবং পুরানো সংস্করণ উভয়ের জন্য সমানভাবে কাজ করবে এবং এখনই কোনও পদ্ধতি হ'ল না, যা হ্রাস করা হয়েছে।
সরল সমাধান
- (CGFloat)textViewHeightForAttributedText: (NSAttributedString*)text andWidth: (CGFloat)width {
UITextView *calculationView = [[UITextView alloc] init];
[calculationView setAttributedText:text];
CGSize size = [calculationView sizeThatFits:CGSizeMake(width, FLT_MAX)];
return size.height;
}
এই ফাংশনটি NSAttributedString
হিসাবে একটি CGFloat
এবং পছন্দসই প্রস্থ নেবে এবং প্রয়োজনীয় উচ্চতা ফিরে আসবে
বিস্তারিত সমাধান
যেহেতু আমি সম্প্রতি কিছু অনুরূপ কাজ করেছি তাই আমি ভেবেছিলাম যে আমি যে সংযুক্ত সমস্যাগুলির মুখোমুখি হয়েছি তার কিছু সমাধানও ভাগ করে নেব। আমি আশা করি এটি কারও সাহায্য করবে।
এটি গভীরতার চেয়ে অনেক বেশি এবং নিম্নলিখিতগুলি আবরণ করবে:
- অবশ্যই: একটি
UITableViewCell
ধারণের সম্পূর্ণ সামগ্রী প্রদর্শনের জন্য প্রয়োজনীয় আকারের উপর ভিত্তি করে একটি উচ্চতা নির্ধারণ করাUITextView
- পাঠ্য পরিবর্তনগুলিতে সাড়া দিন (এবং সারিটির উচ্চতা পরিবর্তনগুলি অ্যানিমেট করুন)
- কার্সারটি দৃশ্যমান অঞ্চলে রাখা এবং সম্পাদনার সময়
UITextView
পুনরায় আকার দেওয়ার UITableViewCell
সময় প্রথমে রেসপনার রাখা
আপনি যদি কোনও স্ট্যাটিক টেবিল ভিউ নিয়ে কাজ করছেন বা আপনার কাছে কেবল একটি পরিচিত সংখ্যা রয়েছে তবে UITextView
আপনি সম্ভাব্যভাবে দ্বিতীয় ধাপটি আরও সহজ করতে পারবেন।
১. প্রথমে উচ্চতাটি রৈঅ্যাট ইন্ডেক্সপথ: ওভাররাইট করুন
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
// check here, if it is one of the cells, that needs to be resized
// to the size of the contained UITextView
if ( )
return [self textViewHeightForRowAtIndexPath:indexPath];
else
// return your normal height here:
return 100.0;
}
2. প্রয়োজনীয় উচ্চতা গণনা করা ফাংশনটি সংজ্ঞা দিন:
আপনার NSMutableDictionary
(যেমন এই উদাহরণে বলা হয় textViews
) আপনার উদাহরণের পরিবর্তনশীল হিসাবে যুক্ত করুনUITableViewController
সাবক্লাসে ।
পৃথকভাবে রেফারেন্স সংরক্ষণ করতে এই অভিধানটি ব্যবহার করুন UITextViews
:
(এবং হ্যাঁ, সূচীপথগুলি অভিধানের জন্য কার্যকর কী )
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
// Do you cell configuring ...
[textViews setObject:cell.textView forKey:indexPath];
[cell.textView setDelegate: self]; // Needed for step 3
return cell;
}
এই ফাংশনটি এখন আসল উচ্চতা গণনা করবে:
- (CGFloat)textViewHeightForRowAtIndexPath: (NSIndexPath*)indexPath {
UITextView *calculationView = [textViews objectForKey: indexPath];
CGFloat textViewWidth = calculationView.frame.size.width;
if (!calculationView.attributedText) {
// This will be needed on load, when the text view is not inited yet
calculationView = [[UITextView alloc] init];
calculationView.attributedText = // get the text from your datasource add attributes and insert here
textViewWidth = 290.0; // Insert the width of your UITextViews or include calculations to set it accordingly
}
CGSize size = [calculationView sizeThatFits:CGSizeMake(textViewWidth, FLT_MAX)];
return size.height;
}
৩. সম্পাদনার সময় পুনরায় আকার সক্ষম করুন
পরবর্তী দুটি ফাংশনের জন্য, এটি গুরুত্বপূর্ণ, আপনার প্রতিনিধিটি আপনার UITextViews
জন্য সেট করা আছে UITableViewController
। যদি আপনার প্রতিনিধি হিসাবে অন্য কিছু প্রয়োজন হয় তবে আপনি সেখান থেকে প্রাসঙ্গিক কলগুলি করে বা উপযুক্ত এনএসএনটিফিকেশন সেন্টার হুক ব্যবহার করে এটিকে ঘিরে কাজ করতে পারেন।
- (void)textViewDidChange:(UITextView *)textView {
[self.tableView beginUpdates]; // This will cause an animated update of
[self.tableView endUpdates]; // the height of your UITableViewCell
// If the UITextView is not automatically resized (e.g. through autolayout
// constraints), resize it here
[self scrollToCursorForTextView:textView]; // OPTIONAL: Follow cursor
}
4. সম্পাদনা করার সময় কার্সার অনুসরণ করুন
- (void)textViewDidBeginEditing:(UITextView *)textView {
[self scrollToCursorForTextView:textView];
}
এটি UITableView
কার্সারের অবস্থানে স্ক্রোলটি তৈরি করবে , যদি এটি ইউআইটিবেল ভিউয়ের দৃশ্যমান রেক্টের ভিতরে না থাকে:
- (void)scrollToCursorForTextView: (UITextView*)textView {
CGRect cursorRect = [textView caretRectForPosition:textView.selectedTextRange.start];
cursorRect = [self.tableView convertRect:cursorRect fromView:textView];
if (![self rectVisible:cursorRect]) {
cursorRect.size.height += 8; // To add some space underneath the cursor
[self.tableView scrollRectToVisible:cursorRect animated:YES];
}
}
5. ইনসেটগুলি সেট করে দৃশ্যমান রেকটকে সামঞ্জস্য করুন
সম্পাদনার সময়, আপনার কিছু অংশ UITableView
কীবোর্ড দ্বারা কভার করা যেতে পারে। যদি টেবিলভিউ ইনসেটগুলি সামঞ্জস্য করা scrollToCursorForTextView:
না হয় তবে এটি যদি আপনার টেক্সটভিউয়ের নীচে থাকে তবে আপনার কার্সারে স্ক্রোল করতে সক্ষম হবে না।
- (void)keyboardWillShow:(NSNotification*)aNotification {
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.tableView.contentInset.top, 0.0, kbSize.height, 0.0);
self.tableView.contentInset = contentInsets;
self.tableView.scrollIndicatorInsets = contentInsets;
}
- (void)keyboardWillHide:(NSNotification*)aNotification {
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.35];
UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.tableView.contentInset.top, 0.0, 0.0, 0.0);
self.tableView.contentInset = contentInsets;
self.tableView.scrollIndicatorInsets = contentInsets;
[UIView commitAnimations];
}
এবং শেষ অংশ:
আপনার ভিউ লোড হয়েছে এর ভিতরে কীবোর্ড পরিবর্তনের জন্য বিজ্ঞপ্তিগুলির জন্য সাইন আপ করুন NSNotificationCenter
:
- (void)viewDidLoad
{
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}
এতক্ষণ এই উত্তর দেওয়ার জন্য দয়া করে আমার উপর ক্ষিপ্ত হবেন না। যদিও প্রশ্নের উত্তর দেওয়ার জন্য এটির সমস্ত প্রয়োজন হয় না, আমি বিশ্বাস করি যে এমন আরও কিছু লোক রয়েছে যারা সরাসরি সম্পর্কিত এই বিষয়গুলিতে সহায়তা করবে।
হালনাগাদ:
ডেভ হাপার্ট যেমন বলেছিলেন, আমি rectVisible
ফাংশনটি অন্তর্ভুক্ত করতে ভুলে গেছি :
- (BOOL)rectVisible: (CGRect)rect {
CGRect visibleRect;
visibleRect.origin = self.tableView.contentOffset;
visibleRect.origin.y += self.tableView.contentInset.top;
visibleRect.size = self.tableView.bounds.size;
visibleRect.size.height -= self.tableView.contentInset.top + self.tableView.contentInset.bottom;
return CGRectContainsRect(visibleRect, rect);
}
এছাড়াও আমি লক্ষ্য করেছি, এটি scrollToCursorForTextView:
এখনও আমার প্রকল্পের পাঠ্য ফিল্ডগুলির একটিতে প্রত্যক্ষ রেফারেন্স অন্তর্ভুক্ত করেছে। আপনার যদি সন্ধান bodyTextView
না পেয়ে সমস্যা হয় তবে ফাংশনের আপডেট হওয়া সংস্করণটি দেখুন।