UIScrollView 内的自动布局 UITextView 大小不正确

Posted

技术标签:

【中文标题】UIScrollView 内的自动布局 UITextView 大小不正确【英文标题】:Autolayout UITextView inside UIScrollView size not correct 【发布时间】:2015-01-30 19:36:48 【问题描述】:

所以我知道关于这个主题已经有很多问题了,但是我还没有找到一个可以解决我的问题的问题(或者我可能不明白答案)。

好的,所以我设置了一个滚动视图,其中包含一个 UIView,顶部包含一个图像视图(您可以忽略的渐变视图),下面是一个文本视图。 textview 必须在不滚动的情况下使用其中的任何内容进行扩展(因此它位于 scrollView 中)。

我有代码:

- (void)viewDidLayoutSubviews 
    [super viewDidLayoutSubviews];

    [self setupGradientView];
    [self resize];


- (void) resize 
    CGFloat maxWidth = [[UIScreen mainScreen] bounds].size.width;
    CGRect newFrame;

    // reset width for scrollview
    newFrame = imageView.frame;
    newFrame.size = CGSizeMake(maxWidth, imageView.frame.size.height);
    imageView.frame = newFrame;
    gradientView.frame = newFrame;
    newFrame = textView.frame;
    newFrame.size = CGSizeMake(maxWidth, textView.frame.size.height);
    //textView.frame = newFrame;


    newFrame = dummyView.frame;
    newFrame.size = CGSizeMake(maxWidth, dummyView.frame.size.height);
    dummyView.frame = newFrame;

    // resize height
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, CGFLOAT_MAX)];
    newFrame = textView.frame;
    newFrame.size = CGSizeMake(fixedWidth, newSize.height);
    //textView.frame = newFrame; 
    self.textViewHeightConstraint.constant = newSize.height;

    CGFloat dummyViewHeight = textView.frame.origin.y + textView.frame.size.height;
    dummyView.frame = CGRectMake(dummyView.frame.origin.x, dummyView.frame.origin.y, dummyView.frame.size.width, dummyViewHeight);
    [scrollView setContentSize:dummyView.frame.size];


不幸的是,内容大小似乎偏离了我认为可能是 16pts,导致文本被截断后的视图看起来像这样(不要介意文本中的 unicode 混乱):

这是 IB 中视图的图片:https://i.imgur.com/hxzzUg2.png

约束层次结构如下所示:https://i.imgur.com/rUepwa2.png

任何帮助将不胜感激!

编辑:如果我在 resize 函数中注释掉整个代码,我会得到相同的结果。在调用函数后,自动布局似乎正在调整所有这些的大小......但我认为调用 viewDidLayoutSubviews 时自动布局已经完成?

编辑2:我试过了,发现即使是n viewDidAppear调整textView的frame也没有效果。 (我可以编辑诸如背景颜色之类的东西)

【问题讨论】:

您希望 UITextView 向下增长,而不是水平增长?是横向扩展吗?我不确定你到底想要什么...... 我希望它向下生长,所以我使用 sizeThatFits 并设置一个静态宽度(屏幕的宽度)和一个 CGFLOAT_MAX 作为高度。我得到了正确的计算,但由于某种原因它没有正确显示 你的resize方法被调用了吗?尝试设置断点。 是的,它正在被调用,并且帧的值是正确的 不要手动设置框架,而是设置自动布局约束以使文本 view.leading 和文本 view.trailing 等于父容器 (scrollview) 并以编程方式为您的高度约束设置常量。跨度> 【参考方案1】:

我最终要做的是为视图(而不是滚动视图)设置等宽和等高,然后手动更改 viewDidLayoutSubviews 中的高度约束,同时更改 textView 的框架和内容大小滚动视图。

【讨论】:

以上是关于UIScrollView 内的自动布局 UITextView 大小不正确的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 自动布局 - UIScrollView 内的 UIImageView

UIScrollView 内的自动布局 UITextView 大小不正确

UIScrollview 内的 UIView 内的 UILabel 上的 UIGestureRecognizer

UITextView 使用自动布局动态扩展为滚动视图内的文本

子视图内的 UIScrollview 高度动态变化

UIScrollView 内的 UIView 未在 3,5 英寸屏幕 iOS 上调整大小