【问题标题】:How do I find scrollview contentoffset Y point to make visible the selected text.如何找到滚动视图内容偏移 Y 点以使所选文本可见。
【发布时间】:2018-02-22 19:17:29
【问题描述】:

我想在滚动视图中使用文本视图来实现文本搜索功能。我已经用“上一个”和“下一个”按钮连接了一个文本视图。当用户单击任一按钮时,它应该滚动到正在搜索的单词/句子。

使用字符串属性和 NSRange 我已经能够找到并突出显示用户选择的单词或句子。

var colorText = new NSMutableAttributedString(fileString, attrFont);
var attrHL = new UIStringAttributes { ForegroundColor = UIColor.Red };
colorText.AddAttributes(attrHL.Dictionary, new NSRange(idxStart, length);

但我不知道如何让滚动视图滚动到所选文本并使其保持可见。由于文本视图中显示的文本大于滚动视图的大小,我必须使用 contentoffset.Y 来移动可见视图,但是如何找到所选单词/句子的 Y 点?

现在,如果显示的文本大于视图大小,搜索的文本会突出显示,但它可能不在可见视图中,我必须手动向下滚动才能看到突出显示的文本。

【问题讨论】:

  • 你看过UITextView.scrollRangeToVisible()方法吗? developer.apple.com/documentation/uikit/uitextview/…
  • 整个文本都在一个标签中吗?还是文本视图?向我们提供有关您在那里的视图层次结构的更多信息
  • 我试过 Textview 的 ScrollRangetoVisible 但不起作用(不滚动)。我相信我必须使用滚动视图的 ScrollRectToVisible 但这需要一个我不知道如何从突出显示的文本中获取的 CGRect() 。如果我能得到突出显示文本开头的 X、Y 点,我应该使用 ScrollRectToVisible()。
  • 文本在文本视图中而不是标签中,因为文本可能很长,因此需要此搜索功能。
  • 如果你让你的文本视图比包含它的滚动视图更高(或更宽),你就是在自找麻烦。会有相互冲突的“滚动手势”,并且如您所见,将文本“显示在视图中”会出现问题。

标签: ios xamarin uiscrollview


【解决方案1】:

假设你知道NSRange(名为range)对应于你想滚动到的文本位,你的UIScrollView被命名为scrollView,你的UITextView被命名为textView

• 将NSRange 值转换为UITextRange

var startPosition = textView.GetPosition(textView.BeginningOfDocument, range.Location);
var endPosition = textView.GetPosition(startPosition, range.Length);

var textRange = textView.GetTextRange(startPosition, endPosition);

• 获取与textRange 在您的textView 中的位置相对应的CGRect

var rect = textView.GetFirstRectForRange(textRange);

• 然后滚动你的scrollView 到那个rect,假设你的textView 的位置是(0, 0)scrollView 的内容区域(否则你将不得不偏移rect) :

scrollView.ScrollRectToVisible(rect, true);

希望这会有所帮助!

【讨论】:

  • 谢谢奥利维尔。根据您的建议,我能够获得 ContentOffSet.Y 值。
猜你喜欢
  • 1970-01-01
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多