Saya akan memposting solusi yang tepat di bagian bawah halaman jika seseorang berani (atau cukup putus asa) untuk membaca sampai titik ini.
Berikut adalah repo gitHub untuk mereka yang tidak ingin membaca semua teks itu: resizableTextView
Ini berfungsi dengan iOs7 (dan saya yakin itu akan bekerja dengan iOs8) dan dengan autolayout. Anda tidak perlu angka ajaib, nonaktifkan tata letak dan hal-hal seperti itu.Solusi singkat dan elegan.
Saya pikir, semua kode terkait kendala harus menuju ke updateConstraints
metode. Jadi, mari kita buat sendiriResizableTextView
.
Masalah pertama yang kami temui di sini adalah yang tidak tahu ukuran konten asli sebelum viewDidLoad
metode. Kita bisa mengambil jalan yang panjang dan buggy dan menghitungnya berdasarkan ukuran font, penghentian baris, dll. Tapi kita membutuhkan solusi yang kuat, jadi kita akan melakukan:
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Jadi sekarang kita tahu sebenarnya contentSize di mana pun kita berada: sebelum atau sesudah viewDidLoad
. Sekarang tambahkan batasan ketinggian pada textView (melalui storyboard atau kode, tidak peduli bagaimana). Kami akan menyesuaikan nilai itu dengan contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Hal terakhir yang harus dilakukan adalah memberi tahu superclass updateConstraints
.
[super updateConstraints];
Sekarang kelas kita terlihat seperti:
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];
}
Cantik dan bersih, bukan? Dan Anda tidak harus berurusan dengan kode itu di controller Anda !
Tapi tunggu!
Y TANPA ANIMASI!
Anda dapat dengan mudah menghidupkan perubahan untuk melakukan textView
peregangan dengan lancar. Berikut ini sebuah contoh:
[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];