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

Posted

技术标签:

【中文标题】如何调整 UIScrollView 的大小以适合子 UITextViews 的内容【英文标题】:how to resize UIScrollView to fit content of children UITextViews 【发布时间】:2014-08-29 01:25:02 【问题描述】:

我有一个 UIScrollView,其中有许多垂直排列的子 UITextView。我希望 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];

对于滚动视图,我会这样做

-(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]。任何想法为什么此设置不起作用?

【问题讨论】:

你可以将示例项目上传到 Github 吗? 没有。我不允许将项目上传到公共仓库。 只需创建一个新的示例项目,1 个带有滚动视图的视图控制器以及 textviews + 调整您所做的 textview/scrollview 大小的代码。 根据我的故障排除,resizeScrollViewToFitContent 无法正常工作。它不是根据其孩子的大小加起来的。随意增加。 我还注意到self.scrollView.contentSize 正在拒绝分配:即使我尝试为其分配一些幻数,它也会拒绝。 【参考方案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 个文本视图的高度的组合。在您的项目中可能会有所不同。

【讨论】:

谢谢。我已经试过了。两个子视图加起来是350。而且即使赋值给scrollView,scrollview的高度也是520(帧高)。但问题似乎是框架与内容大小。我检查时内容大小是正确的。但是当我检查框架高度的大小时,它失败了。并且做[self.scrollView sizeToFit] 并没有帮助。 “失败”是什么意思?根据我的经验,scrollView 的帧大小通常固定在情节提要上。我只在任何子视图需要调整大小时调整滚动视图的内容大小。您可能想从情节提要中检查这一点。最好能将示例项目上传到某个地方,以便我了解全貌。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

例如,您可能有一个带有 uiimageview 和 uilabel 的 uiview,因此您的子视图计数将是应有的 3 倍。

试试

// csv = 内容滚动视图

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

【讨论】:

以上是关于如何调整 UIScrollView 的大小以适合子 UITextViews 的内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局调整视图大小以适合标签子视图?

调整 UIView 的大小以适应 uiScrollView 中的所有内容

如何调整 CTabCtrl 的大小以适合其内容

调整滚动视图框架的大小时,UIScrollView 子视图的大小调整不正确

UIScrollView 子视图不会调整大小

使用 UIScrollView 和 AutoLayout 以编程方式创建控制器无法正确调整视图大小