【问题标题】:Refresh UITextView's Scroll Position on iPhone在 iPhone 上刷新 TextView 滚动位置
【发布时间】:2010-11-23 13:17:47
【问题描述】:

我想对 UITextView 进行某种类型的刷新,以将 textview 设置回其原始状态。我有一个段落会根据用户单击的 TableViewCell 动态填充。因此,当他们滚动文本字段,然后返回并选择另一个单元格并返回时,文本会更改,但滚动位置会在用户离开时保持不变。如何将其恢复为默认状态。谢谢!

【问题讨论】:

  • 请注意,我一直在尝试使用 [myTextView scrollRangeToVisible:NSMakeRange([myTextView.text length], 0)];

标签: iphone refresh scroll uitextview


【解决方案1】:

默认状态下,你的意思是滚动到顶部吗?如果是这样,你就在正确的轨道上。试试

[myTextView scrollRangeToVisible:NSMakeRange(0, 0)];

【讨论】:

  • 我也尝试过,但它似乎没有到达文本的真正顶部。它只接近顶部,但看起来不像默认值。老实说,我对 NSRange 的东西并不是很了解。
  • 我刚刚用我拥有的应用程序尝试了这个,它对我有用。您能否发布您的模拟器的屏幕截图,以便我们查看行为?
  • 这里是一些屏幕截图:初始、手动向下滚动和重新加载angelfilm.net/external/stackoverflow/mos
  • 你可以用手指手动让它滚动到顶部吗?
  • 如果您在我的回答中为该行代码设置了断点,当您重新加载此视图时它会被命中吗?
【解决方案2】:

我发现如果我先清除 UITextView 然后应用新文本,它会自动“滚动”回顶部。

myTextView.text = @"";
myTextView.text = theRealTextContent;

【讨论】:

    【解决方案3】:

    如果您希望它向上滚动到顶部,则此方法有效:

    [theTextView scrollRangeToVisible:NSMakeRange(0, 0)];
    

    唯一的问题是它会向上动画。如果你想让它吸附到顶部,使用这个:

    [theTextView scrollRectToVisible:CGRectMake(0, 0, 1, 1) animated:NO];
    

    【讨论】:

    • 这个解决方案对我有用。我在 viewDidLoad 中加载了文本,更改了 UITextView 的 ContentInset,然后不得不使用 scrollRectToVisible 来使顶部正确对齐。谢谢
    【解决方案4】:
    [textview setScrollEnabled:YES];
    textview.text = yourText;
    [textview setScrollEnabled:NO];
    

    【讨论】:

    • 我实际上想在更新内容时阻止 textView 滚动,所以我只是反过来做了,它完美地工作。谢谢。
    【解决方案5】:

    这些方法中的任何一种都没有让我满意。

    • scrollRangeToVisible 会产生大量的视觉伪影(在大字符串之间切换时会出现大量滚动),实际上仅在内容更改后的延迟调用中(我使用了 0.1 秒)才有效,而不是正如 Shaggy Frog 的回答所暗示的那样。

    • 在设置新内容之前将文本设置为 @"" 没有帮助,即使有延迟。

    似乎一旦输入了 UITextView,它就永远处于这种设置新内容会导致烦人的滚动伪影的模式下。我也尝试将 selectionRange 设置为 UITextView 的开头,但这没有帮助。在设置新内容之前发送 resignFirstResponder 消息也没有帮助。

    因此,我决定在每次更改内容时删除并重新创建 UITextView。在我的应用程序中,这是一个非常罕见的事件(基于人类交互),它不是性能问题。这是我能找到的将新内容“加载”到 UITextView 中而没有大量烦人的滚动伪影的唯一方法。

    我的经验是使用 OS3.2(ipad 模拟器)

    【讨论】:

      【解决方案6】:

      我设法得到了想要的结果——在编辑结束时强制 UITextView '滚动'到其内容的顶部。但要实现它,我必须在 textViewDidEndEditing 中禁用滚动,并以相同的方法重置文本。

      我在 textViewDidBeginEditing 中重新启用滚动。

      - (void) textViewDidEndEditing: textView;
      {
         [textView setScrollEnabled: NO];
         NSString* savedText = [textView text];
         [textView setText:@""];
         [textView setText: savedText];
      }
      

      【讨论】:

        【解决方案7】:

        最终对我有用的是什么清除文本内容,然后在下一个运行循环中将其设置为所需的文本。

        // clear the text view
        self.textView.text = ""
        
        // set the text on the next run loop
        dispatch_async(dispatch_get_main_queue()) {
            self.textView.text = someText
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-31
          • 2011-07-31
          • 2015-08-11
          • 1970-01-01
          • 1970-01-01
          • 2021-08-14
          • 2013-07-12
          • 2012-10-21
          相关资源
          最近更新 更多