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



我有一个UIScrollView,其中有许多子UITextViews垂直排列。我想调整UIScrollView的大小以适应内容。所以我的文本视图我做

- (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];
}

对于滚动视图,我做

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

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

我不确定您的textView在scrollView中的排列方式。我假设它们垂直排列,紧挨着。我创建了一个带有滚动视图和3个文本视图的示例项目,它与以下代码配合良好:-

-(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;
}

在我自己的项目中,滚动视图的内容Height是所有3个文本视图的高度的组合。在你的项目中可能会有所不同。

您不应该进行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的子视图。这可能会影响上述代码的准确性,但我发现它总是有效的,除非在某些非常特殊的情况下。

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

例如,你可能有一个带有uiimageview和uilabel的uiview,所以你的子视图计数将是它应该是的3倍

尝试

//csv=内容滚动视图

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

最新更新