【问题标题】:Setting UITextView frame to content size no longer works in Xcode 5将 UITextView 框架设置为内容大小不再适用于 Xcode 5
【发布时间】:2013-09-22 11:15:57
【问题描述】:

在安装 Xcode 5 之前,下面的代码 sn-p 用于将 UITextView 框架的大小调整为它的内容高度,但它在升级后就不起作用了:

CGRect frame = _textView.frame;
frame.size.height = _textView.contentSize.height;
_textView.frame = frame;

我已经搜索并没有找到解决方法。有什么想法吗?

【问题讨论】:

    标签: objective-c xcode5


    【解决方案1】:

    在 iOS 7 上有新的东西。

    要获得文本视图在更新其文本后使用的“适合”大小,请在 textView 的 layoutManager 属性上调用 usedRectForTextContainer:,并将 textView 的 textContainer 属性作为参数传递。

    关于滚动的警告词:但请注意,如果在文本视图上禁用滚动,则更改文本视图的框架大小更新它的文本后可能会出现意外的视觉错误。如果发生这种情况,请在编辑文本视图的文本之前启用滚动,然后在更新后禁用它(如果您需要滚动以保持禁用状态)。

    【讨论】:

    • 太棒了!它有效,谢谢!我会给这个答案一个点,但我没有足够的代表:(
    • 我正在为此苦苦挣扎,无法让它工作,你能提供一个示例代码吗?谢谢。
    • 一个代码示例会很有用。我将您的答案解释为[[textView layoutManager] usedRectForTextContainer:[textView textContainer]];,它不会调整 textView 的高度以适应内容
    • 对我不起作用 -- usedRectForTextContainer 有时会返回一个巨大的高度数,有时会根据 textView 的先前内容返回一个不正确的数字(即,您刚刚用 @ 替换的内容) 987654326@).
    • 我不敢相信......我真的很纠结为什么 textView 没有返回正确的大小,所以按照你的建议,我打开了滚动......它起作用了......
    【解决方案2】:

    要在 iOS 7 (Xcode 5) 中工作,只需:

    1. 给整个空间来接收文本,通过设置:

      [myTextView setScrollEnabled:YES];

    2. 传递真实文本:

      myTextView.text = theTextVariable;myTextView.text = @"The text...";

    3. 自动调整文本视图的大小:

      [myTextView sizeToFit];

    4. 禁用滚动:

      [myTextView setScrollEnabled:NO];

    PS:myTextView 也可以用作 self.myTextView 或 _myTextView

    玩得开心!

    【讨论】:

    • 对我不起作用——我需要改用[textView layoutIfNeeded](请参阅下面的答案)。我真的很困惑为什么有些人认为这有效,而其他人(不仅仅是我)显然没有。
    【解决方案3】:

    我相信强制 textView 更新其 contentSize 的正确方法是调用

    [textView layoutIfNeeded]
    

    但是,在 iOS 7.0 和 7.1 中,这似乎仍然无法可靠地工作,除非您先设置

    textView.layoutManager.allowsNonContiguousLayout = false;
    

    我不清楚这是否是一个错误,因为我无法很好地解释“非连续布局”的含义。

    (我的个人用例是以编程方式更新textView.text = newValue,然后尝试适当地调整 textView 的大小。)

    【讨论】:

    • 整天都在搜索 - 这是唯一对我有用的解决方案。谢谢。
    • allowsNonContiguousLayout 仍然是 iOS 9 中解决问题的关键!谢谢
    【解决方案4】:
    [textView sizeToFit];
    

    是你需要的。

    您需要做的就是确保:

    [textView setScrollEnabled:YES];
    

    在设置 UITextView 文本内容之前。

    然后你可以:

    [textView sizeToFit];
    [textView setScrollEnabled:NO];
    

    设置文本后。与编写自己的 bling 函数或使用复杂的边界 rect 方法相同。解决方案只有三行那么简单,为什么还要使用这么复杂的东西?

    也就是说,像这样包装这些函数:

    - (void) setText:(NSString *)theTextToAdd andResizeTheDamnTextView:(UITextView *)textView {
        [textView setScrollEnabled:YES];
        [textView setText:theTextToAdd];
        [textView sizeToFit];
        [textView setScrollEnabled:NO];
    }
    

    并在每个文件或全局基础上定义它,以避免必须手动编写或复制/粘贴四行并每次调用它。只需将其称为:

    [yourTextViewIvar setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar];
    

    如果这不起作用:

    [yourTextViewIvar setText:[self setText:@"DUMMY STRING" andResizeTheDamnTextView:yourTextViewIvar]];
    

    你会是金色的。

    我认为..

    那是伪代码。仅供参考。

    【讨论】:

    • 我有一个UITextView *commentTextView 并在-viewWillAppear 中使用commentTextView.text = commentStringForItem 更新内容。 (我有时也会更新它以响应 UI 操作。)然后我想调整该字段的大小,以便它显示尽可能多的评论,所以我尝试检查 commentTextView.contentSize。这个值是不正确的(不是从之前的值更新的),除非我第一次调用[commentTextView layoutIfNeeded] -- sizeToFit 不起作用。
    • 跟随sizeToFitcommentTextView.scrollEnabled = false; commentTextView.scrollEnabled = true; 似乎没有帮助。 (在一般情况下,我希望在我的字段上启用 scrollEnabled。)另外,当我只想调整字段的高度时,sizeToFit 会混淆我的字段的宽度。
    • 在调用sizeToFit之前确保.scrollEnabledTRUE,它肯定会相应地更新。随时将scrollEnabled 设置为TRUEFALSE 仅适用于不希望与之互动的人。
    【解决方案5】:

    一个更简单的解决方案是使用:

    [textViewExample sizeToFit];    
    

    这对我有用。

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2011-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多