सबसे पहले, यह नोट करना बहुत महत्वपूर्ण है, कि UITextView और UILabel के बीच एक बड़ा अंतर है जब यह आता है कि पाठ कैसे प्रस्तुत किया जाता है। न केवल UITextView में सभी सीमाओं पर इनसेट हैं, बल्कि इसके अंदर का टेक्स्ट लेआउट भी थोड़ा अलग है।
इसलिए, sizeWithFont:
UITextViews के लिए जाने के लिए एक बुरा तरीका है।
इसके बजाय UITextView
अपने आप में एक फ़ंक्शन होता है, sizeThatFits:
जो UITextView
एक बाउंडिंग बॉक्स के अंदर की सभी सामग्रियों को प्रदर्शित करने के लिए आवश्यक सबसे छोटे आकार को लौटाएगा , जिसे आप निर्दिष्ट कर सकते हैं।
निम्नलिखित iOS 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
, तो आप संभावित रूप से चरण 2 को बहुत सरल बना सकते हैं।
1. सबसे पहले, ऊँचाई को लिखें। RowAtIndexPath:
- (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
करें:
(और हाँ, indexPaths शब्दकोशों के लिए मान्य कुंजी हैं )
- (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;
}
3. संपादन करते समय आकार बदलने में सक्षम करें
अगले दो कार्यों के लिए, यह महत्वपूर्ण है, कि प्रतिनिधि UITextViews
आपके लिए निर्धारित है UITableViewController
। यदि आपको प्रतिनिधि के रूप में कुछ और चाहिए, तो आप वहां से संबंधित कॉल करके या उपयुक्त NSNotificationCenter हुक का उपयोग करके इसके चारों ओर काम कर सकते हैं।
- (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:
अभी भी मेरी परियोजना में एक TextFields के लिए एक सीधा संदर्भ शामिल है। यदि आपको bodyTextView
नहीं मिलने की समस्या है, तो फ़ंक्शन के अद्यतन संस्करण की जांच करें।