Birisi bu noktaya okumak için cesur (veya yeterince umutsuz) olması durumunda sayfanın altına doğru çözümü gönderirim.
İşte tüm bu metni okumak istemeyenler için gitHub repo: resizableTextView
Bu, iOs7 (ve iOs8 ile çalışacağına inanıyorum) ve autolayout ile çalışır. Sihirli numaralara, düzeni devre dışı bırakmanıza ve bunun gibi şeylere ihtiyacınız yoktur.Kısa ve zarif bir çözüm.
Bence, kısıtlama ile ilgili tüm kodlar updateConstraints
yönteme geçmelidir . Öyleyse, kendimizi yaratalım ResizableTextView
.
Burada karşılaştığımız ilk sorun, viewDidLoad
yöntemden önce gerçek içerik boyutunu bilmemektir . Uzun ve buggy bir yol alabilir ve yazı tipi boyutuna, satır sonlarına vb. Dayalı olarak hesaplayabiliriz.
CGSize contentSize = [self sizeThatFits:CGSizeMake(self.frame.size.width, FLT_MAX)];
Şimdi nerede olduğumuza bakılmaksızın gerçek içeriği biliyoruz: önce veya sonra viewDidLoad
. Şimdi textView'e yükseklik kısıtlaması ekleyin (film şeridi veya kod aracılığıyla, nasıl olursa olsun). Bu değeri aşağıdakilerle ayarlayacağız contentSize.height
:
[self.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstAttribute == NSLayoutAttributeHeight) {
constraint.constant = contentSize.height;
*stop = YES;
}
}];
Yapılacak son şey süper sınıfa anlatmak updateConstraints
.
[super updateConstraints];
Şimdi sınıfımız şöyle görünüyor:
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];
}
Güzel ve temiz, değil mi? Ve kontrolörlerinizde bu kodla uğraşmanıza gerek yok !
Fakat bekle!
Y HAYIR CANLANDIRMA!
Kolayca textView
germek için değişiklikleri kolayca canlandırabilirsiniz . İşte bir örnek:
[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];