2013-11-07 3 views
9

Я пытаюсь изменить размер текстового представления в соответствии с содержимым &, также это родственный и родительский контейнер.Изменить размер 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 решения от: How do I size a UITextView to its content on 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; 

ответ

26

кажется UITextView'scontentSize свойство не установлено правильно прошивкой 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'ssetContentSize: метод вызывается из layoutSubviews. Так, называя layoutIfNeeded на textView (который сам называет layoutSubviews) после вызова ensureLayoutForTextContainer: по ИТС layoutManager, следует сделать textView'scontentSize правильно.

[someTextView.layoutManager ensureLayoutForTextContainer:someTextView.textContainer]; 
[someTextView layoutIfNeeded]; 
// someTextView.contentSize should now have correct value 
+0

Следуйте ссылке ниже для точного ответа: http://trio-hasim.blogspot.in/2014/01/get-uitextview-content-size-in-ios7.html –

+0

@NSBouzouki работает нормально в iOS7, но давая сбой в iOS6 –

+0

Также обратите внимание, что изменение размера должно выполняться как минимум после того, как макет вычисляется в viewDidLayoutSubview, чтобы убедиться, что была выполнена какая-то математика на компоновке layoutContainer. Если вы обновляете контент из Интернета, используйте layoutIfNeeded, который запускает макет, а затем обновляет размер в viewDidLayoutSubview. –

1

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 
Смежные вопросы