मैं अपने विचार जोड़ना चाहूंगा क्योंकि मेरे पास बिल्कुल यही समस्या थी।
मैं इसका उपयोग कर रहा था, UITextView
क्योंकि इसमें अच्छे पाठ संरेखण (औचित्य था, जो उस समय उपलब्ध नहीं था UILabel
), लेकिन गैर-संवादात्मक-गैर-स्क्रॉल करने योग्य "अनुकरण" करने के लिए UILabel
, मैं पूरी तरह से स्क्रॉलिंग, बाउंसिंग और उपयोगकर्ता इंटरैक्शन को बंद कर दूंगा ।
बेशक, समस्या यह थी कि पाठ गतिशील था, और जब चौड़ाई तय हो जाएगी, तो हर बार जब मुझे नया पाठ मान सेट करना होगा, तो ऊँचाई पुनर्गणना होनी चाहिए।
boundingRectWithSize
मेरे लिए बिल्कुल भी अच्छा काम नहीं किया, जो कुछ भी मैं देख सकता UITextView
था , वह शीर्ष पर कुछ मार्जिन जोड़ रहा था जो boundingRectWithSize
एक गिनती में नहीं आएगा, इसलिए, जिस ऊंचाई से प्राप्त किया boundingRectWithSize
गया था वह उससे छोटा होना चाहिए।
चूंकि टेक्स्ट को तेजी से अपडेट नहीं किया जाना था, इसलिए इसका उपयोग केवल कुछ सूचनाओं के लिए किया जाता है जो हर 2-3 सेकंड में सबसे अधिक अपडेट हो सकती हैं, मैंने निम्नलिखित दृष्टिकोण का फैसला किया है:
/* This f is nested in a custom UIView-inherited class that is built using xib file */
-(void) setTextAndAutoSize:(NSString*)text inTextView:(UITextView*)tv
{
CGFloat msgWidth = tv.frame.size.width; // get target's width
// Make "test" UITextView to calculate correct size
UITextView *temp = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, msgWidth, 300)]; // we set some height, really doesn't matter, just put some value like this one.
// Set all font and text related parameters to be exact as the ones in targeted text view
[temp setFont:tv.font];
[temp setTextAlignment:tv.textAlignment];
[temp setTextColor:tv.textColor];
[temp setText:text];
// Ask for size that fits :P
CGSize tv_size = [temp sizeThatFits:CGSizeMake(msgWidth, 300)];
// kill this "test" UITextView, it's purpose is over
[temp release];
temp = nil;
// apply calculated size. if calcualted width differs, I choose to ignore it anyway and use only height because I want to have width absolutely fixed to designed value
tv.frame = CGRectMake(tv.frame.origin.x, tv.frame.origin.y, msgWidth, tv_size.height );
}
* उपरोक्त कोड सीधे मेरे स्रोत से कॉपी नहीं किया गया है, मुझे इसे इस लेख के लिए आवश्यक अन्य सामान के गुच्छा से समायोजित / साफ़ करना था। इसे कॉपी-पेस्ट-एंड-इट-विल-वर्क-कोड के लिए न लें।
स्पष्ट नुकसान यह है कि यह प्रत्येक कॉल के लिए आवंटित और जारी किया गया है।
लेकिन, लाभ यह है कि आप कैसे boundingRectWithSize पाठ और गणना ड्रॉ के बीच संगतता के आधार पर से बचने है यह के आकार और में पाठ ड्राइंग के कार्यान्वयन UITextView
(या UILabel
जो भी आप बस की जगह उपयोग कर सकते हैं UITextView
के साथ UILabel
)। कोई भी "बग" जो कि Apple का हो सकता है, इस तरह से बचा जा सकता है।
PS ऐसा लगता है कि आपको इस "अस्थायी" की आवश्यकता नहीं है UITextView
और यह sizeThatFits
सीधे लक्ष्य से पूछ सकता है, हालांकि यह मेरे लिए काम नहीं करता था। यद्यपि तर्क यह कहता है कि इसे काम करना चाहिए और अस्थायी आवंटन / आवंटन की UITextView
आवश्यकता नहीं है, यह नहीं किया। लेकिन यह समाधान मेरे द्वारा निर्धारित किसी भी पाठ के लिए त्रुटिपूर्ण काम करता है।
lineBreakMode
?