Изменение размера UItextview в соответствии с его содержимым в iOS7
Я пытаюсь изменить размер текстового представления в соответствии с содержимым, а также его родным и родительским контейнером.
Ниже код работает нормально в iOS 6
if (/* less than ios 7 */) {
CGRect frame = _textView.frame;
CGSize conSize = _textView.contentSize;
CGFloat difference = conSize.height - frame.size.height;
frame.size.height += difference;
_textView.frame = frame;
UIScrollView *parentView = (UIScrollView *)_textView.superview;
// adjust views residing below this text view.
// sibling view
UIView *belowView = // access it somehow
CGRect frame1 = belowView.frame;
frame1.origin.y += difference;
belowView.frame = frame1;
// adjust parent scroll view, increase height.
CGSize frame3 = parentView.contentSize;
frame3.height += difference;
parentView.contentSize = frame3;
} else {
// tried
[_textView sizeToFit];
[_textView layoutIfNeeded];
[parentView sizeToFit];
[parentView layoutIfNeeded];
}
Попытался следовать решению iOS 7 из: Как мне настроить UITextView для его содержимого на iOS 7?
но не работает.
Есть указатели?
Решение рабочего кода от @NSBouzouki
if (/* ios 7 */) {
[_textView.layoutManager ensureLayoutForTextContainer:_textView.textContainer];
[_textView layoutIfNeeded];
}
CGRect frame = _textView.frame;
CGSize conSize = _textView.contentSize;
CGFloat difference = conSize.height - frame.size.height;
frame.size.height += difference;
_textView.frame = frame;
UIScrollView *parentView = (UIScrollView *)_textView.superview;
// adjust views residing below this text view.
// sibling view
UIView *belowView = // access it somehow
CGRect frame1 = belowView.frame;
frame1.origin.y += difference;
belowView.frame = frame1;
// adjust parent scroll view, increase height.
CGSize frame3 = parentView.contentSize;
frame3.height += difference;
parentView.contentSize = frame3;
2 ответа
Похоже на то UITextView's
contentSize
свойство неправильно установлено в iOS 7 до viewDidAppear:
, Это наверное потому что NSLayoutManager
выкладываете текст лениво и весь текст должен быть выложен для contentSize
чтобы быть правильным. ensureLayoutForTextContainer:
метод заставляет макет предоставленного текстового контейнера, после которого usedRectForTextContainer:
может быть использован для получения границ. Чтобы правильно определить общую ширину и высоту, textContainerInset
собственность должна быть принята во внимание. Следующий метод работал для меня.
- (CGRect)contentSizeRectForTextView:(UITextView *)textView
{
[textView.layoutManager ensureLayoutForTextContainer:textView.textContainer];
CGRect textBounds = [textView.layoutManager usedRectForTextContainer:textView.textContainer];
CGFloat width = (CGFloat)ceil(textBounds.size.width + textView.textContainerInset.left + textView.textContainerInset.right);
CGFloat height = (CGFloat)ceil(textBounds.size.height + textView.textContainerInset.top + textView.textContainerInset.bottom);
return CGRectMake(0, 0, width, height);
}
Кроме того, кажется UITextView's
setContentSize:
метод вызывается из layoutSubviews
, Итак, звоня layoutIfNeeded
на textView
(который сам называет layoutSubviews
) после звонка ensureLayoutForTextContainer:
на его layoutManager
, должен сделать textView's
contentSize
правильный.
[someTextView.layoutManager ensureLayoutForTextContainer:someTextView.textContainer];
[someTextView layoutIfNeeded];
// someTextView.contentSize should now have correct value
GrowingTextViewHandler является подклассом NSObject, который изменяет размер текстового представления как пользовательский текст. Вот как вы можете использовать это.
@interface ViewController ()<UITextViewDelegate>
@property (weak, nonatomic) IBOutlet UITextView *textView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *heightConstraint;
@property (strong, nonatomic) GrowingTextViewHandler *handler;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.handler = [[GrowingTextViewHandler alloc]initWithTextView:self.textView withHeightConstraint:self.heightConstraint];
[self.handler updateMinimumNumberOfLines:3 andMaximumNumberOfLine:8];
}
- (void)textViewDidChange:(UITextView *)textView {
[self.handler resizeTextViewWithAnimation:YES];
}
@end