如何调整 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 中的所有内容