मैं इस बिंदु पर पढ़ने के लिए किसी के बहादुर (या पर्याप्त निराश) होने पर पृष्ठ के नीचे सही समाधान पोस्ट करूंगा।
यहाँ उन लोगों के लिए gitHub रेपो है, जो उस सभी पाठ को पढ़ना नहीं चाहते हैं: resizableTextView
यह iOs7 के साथ काम करता है (और मुझे विश्वास है कि यह iOs8 के साथ काम करेगा) और ऑटोलॉयआउट के साथ। आपको जादू की संख्या की आवश्यकता नहीं है, लेआउट और सामान को अक्षम करें। संक्षिप्त और सुरुचिपूर्ण समाधान।
मुझे लगता है, कि सभी बाधाओं से संबंधित कोड को updateConstraints
विधि पर जाना चाहिए । तो, चलो अपना खुद का बनाते हैं ResizableTextView
।
यहाँ हम पहली समस्या यह है कि viewDidLoad
विधि से पहले वास्तविक सामग्री का आकार नहीं जानते हैं । हम लंबी और छोटी सड़क ले सकते हैं और इसे फ़ॉन्ट आकार, लाइन ब्रेक आदि के आधार पर गणना कर सकते हैं, लेकिन हमें मजबूत समाधान की आवश्यकता है, इसलिए हम करेंगे:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
तो अब हम जानते हैं कि वास्तविक सामग्री को कोई फर्क नहीं पड़ता कि हम कहाँ हैं: पहले या बाद में viewDidLoad
। अब textView (स्टोरीबोर्ड या कोड के माध्यम से, कोई फर्क नहीं पड़ता) पर ऊंचाई की बाधा जोड़ें। हम उस मान को अपने साथ समायोजित करेंगे contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
अंतिम बात यह है कि सुपरक्लास को बताना है updateConstraints
।
[super updateConstraints];
अब हमारा वर्ग ऐसा दिखता है:
ResizableTextView.m
- (void) updateConstraints {
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
[super updateConstraints];
}
सुंदर और साफ है, है ना? और आपको अपने नियंत्रकों में उस कोड से निपटने की ज़रूरत नहीं है !
लेकिन रुकें!
Y नहीं एनिमेशन!
आप आसानी से textView
खिंचाव को सुगम बनाने के लिए आसानी से चेतन कर सकते हैं । यहाँ एक उदाहरण है:
[self.view layoutIfNeeded];
// do your own text change here.
self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
[self.infoTextView setNeedsUpdateConstraints];
[self.infoTextView updateConstraintsIfNeeded];
[UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
[self.view layoutIfNeeded];
} completion:nil];