在iOS7中根据其内容调整UITextview的大小

9
我正在尝试根据内容以及其兄弟和父容器的大小来调整文本视图的大小。
以下代码在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;
2个回答

26

在 iOS 7 版本中,UITextViewcontentSize 属性直到 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);
    }

此外,似乎 UITextViewsetContentSize: 方法是从 layoutSubviews 中调用的。因此,在对 layoutManager 上的 ensureLayoutForTextContainer: 进行调用后,在 textView 上调用 layoutIfNeeded(它本身调用layoutSubviews),应该能够使 textViewcontentSize 正确。

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

请点击以下链接获取准确答案: http://trio-hasim.blogspot.in/2014/01/get-uitextview-content-size-in-ios7.html - Suraj Mirajkar
请注意,缩放应该在viewDidLayoutSubview中计算布局后进行,以确保layoutContainer上的一些数学计算已经执行。如果您从互联网更新内容,请使用layoutIfNeeded触发布局,然后在viewDidLayoutSubview中更新大小。 - Hugues BR

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接