ฉันต้องการเพิ่มความคิดของฉันเนื่องจากฉันมีปัญหาเดียวกัน
ฉันใช้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 อาจหลีกเลี่ยง
ป.ล. ดูเหมือนว่าคุณไม่จำเป็นต้องใช้ "temp" นี้UITextView
และสามารถขอsizeThatFits
โดยตรงจากเป้าหมายได้ แต่นั่นก็ไม่ได้ผลสำหรับฉัน แม้ว่าตรรกะจะบอกว่ามันควรจะทำงานได้และUITextView
ไม่จำเป็นต้องจัดสรร / ปล่อยชั่วคราวแต่ก็ไม่ได้ แต่วิธีนี้ใช้ได้อย่างไร้ที่ติสำหรับข้อความใด ๆ ที่ฉันตั้งไว้
lineBreakMode
หรือไม่?