如何调整UIScrollView的大小以适应子UITextViews的内容

时间:2014-08-29 01:25:03

标签: ios iphone uiscrollview xcode5 uitextview

我有一个UIScrollView,其中包含许多垂直排列的子UITextViews。我希望UIScrollView调整大小以适应内容。所以我的TextViews

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
    [textView setNeedsLayout];
}

对于我做的scrollview

-(void)resizeScrollViewToFitContent
{
    CGRect contentRect = CGRectZero;
    for (UIView *view in self.scrollView.subviews) {
        contentRect = CGRectUnion(contentRect, view.frame);
    }
    self.scrollView.contentSize = contentRect.size;
}

我在[self resizeScrollViewToFitContent]内拨打viewDidAppear。有什么想法为什么这个设置不起作用?

3 个答案:

答案 0 :(得分:1)

我不确定你的textViews在scrollView中的排列方式。我假设它们垂直排列在彼此旁边。我创建了一个带有scrollView和3个textViews的示例项目,它可以很好地处理以下代码: -

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    CGFloat height = self.textView1.frame.size.height +self.textView2.frame.size.height +self.textView3.frame.size.height ;
    CGSize size = CGSizeMake(self.scrollView.frame.size.width, height);
    self.scrollView.contentSize = size;
}

从我自己的项目中,滚动视图的内容高度是所有3个文本视图的高度组合。它可能与您的项目不同。

答案 1 :(得分:0)

您不应该使用contentFrame和view.frame的联合。请尝试以下方法:

-(void)resizeScrollViewToFitContent
{
    UIScrollView* scrollView;
    CGSize contentSize = CGSizeZero;
    for (UIView* subview in scrollView.subviews)
    {
        CGFloat subviewRight = CGRectGetMaxX(subview.frame);
        if (subviewRight > contentSize.width)
        {
            contentSize.width = subviewRight;
        }

        CGFloat subviewBottom = CGRectGetMaxY(subview.frame);
        if (subviewBottom > contentSize.height)
        {
            contentSize.height = subviewBottom;
        }
    }
    scrollView.contentSize = contentSize;
}

值得注意的一件小事:UIScrollView的滚动指示器是任何UIScrollView的子视图。这有可能摒弃上述代码的准确性,但我发现它总能起作用,除非在某些非常特殊的情况下。

答案 2 :(得分:0)

如果您知道每行滚动浏览中有多少个子视图,那么您需要做一些数学运算才能找到正确的高度。

例如,您可能有uiviewview和uilabel的uiview,因此您的子视图计数将是它应该的3倍。

// csv = contentscrollview

NSLog(@"%d", [[csv subviews] count] / 3);