ฉันจะโพสต์ทางออกที่ถูกต้องที่ด้านล่างของหน้าในกรณีที่มีผู้กล้า (หรือสิ้นหวังมากพอ) ที่จะอ่านจนถึงจุดนี้
นี่คือ gitHub repo สำหรับผู้ที่ไม่ต้องการอ่านข้อความทั้งหมด: resizableTextView
สิ่งนี้ใช้ได้กับ iOs7 (และฉันเชื่อว่ามันจะใช้งานได้กับ iOs8) และ autolayout คุณไม่จำเป็นต้องมีหมายเลขมายากลปิดการใช้งานเลย์เอาต์และสิ่งต่างๆเช่นนั้นในระยะสั้นและทางออกที่สวยงาม
ผมคิดว่าทุกรหัสข้อ จำกัด ที่เกี่ยวข้องควรจะไปที่updateConstraints
วิธีการ ดังนั้นขอให้เราเองResizableTextView
ดังนั้นขอให้เราเอง
ปัญหาแรกที่เราพบที่นี่คือไม่ทราบขนาดเนื้อหาจริงก่อนviewDidLoad
วิธีการ เราสามารถใช้ถนนที่ยาวและบั๊กกี้และคำนวณตามขนาดตัวอักษรการขึ้นบรรทัดใหม่และอื่น ๆ แต่เราต้องการโซลูชันที่มีประสิทธิภาพดังนั้นเราจะทำดังนี้
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
ดังนั้นตอนนี้เรารู้จริง contentSize ไม่ว่าเราอยู่ที่ไหน: viewDidLoad
ก่อนหรือหลัง ตอนนี้เพิ่มข้อจำกัดความสูงของ textView (ผ่านกระดานเรื่องราวหรือรหัสไม่ว่าจะเป็นอย่างไร) เราจะปรับมูลค่านั้นด้วยcontentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
สิ่งสุดท้ายที่จะทำคือการบอก superclass 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];
}
สวยและสะอาดใช่มั้ย และคุณไม่จำเป็นต้องจัดการกับรหัสนั้นในคอนโทรลเลอร์ของคุณ!
แต่เดี๋ยวก่อน!
ไม่มีภาพเคลื่อนไหว!
คุณสามารถเปลี่ยนแปลงการเคลื่อนไหวได้อย่างง่ายดายเพื่อให้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];