如何滚动到属性字符串的特定部分

时间:2013-08-11 23:26:10

标签: ios uiscrollview nsattributedstring

我有一个NSMutableAttributedString,它位于UIScrollView中。我使用addAttributes:range:函数突出显示字符串的一部分。

当存在大量文本时,我目前必须手动滚动很多方法才能到达突出显示的部分。我想提出一种方法,让视图在加载视图时自动滚动到突出显示的部分 - 类似于如何使用anchors to link to a specific part of a webpage

我猜有一个函数,给定某种数字可以让我滚动到我页面的特定部分?我怎么能拿出这样的数字来提供这样的功能呢?使用属性字符串中的NSRange组件?

也许有更好的方法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

UIScrollView使用方法setContentOffset:animated:,可以滚动到内容中的特定点。要确定适当的偏移量,您必须在突出显示的部分之前确定属性字符串部分的宽度。用于执行此操作的方法的文档can be found here。您可以使用size的{​​{1}}方法执行此操作。

它看起来像这样:

NSAttributedString

上面的代码假设我们正在谈论单行文本并且水平滚动。或者,对于包装到任意高度的固定宽度,您需要使用以下代码(而不是referencedSubstring.size.height)计算高度,然后可能会减去一点,以便想要显示最后一行子串:

@interface SomeViewController : UIViewController
@end

@implementation SomeViewController {
    UIScrollView* _scrollView;
}

- (void)scrollToOffset:(NSInteger)offset inAttributedString:(NSAttributedString*)attributedString {
    NSAttributedString* attributedSubstring = [attributedString attributedSubstringFromRange:NSMakeRange(0, offset)];
    CGFloat width = attributedSubstring.size.width;
    [_scrollView setContentOffset:CGPointMake(width, 0.0f) animated:YES];
}
@end

这与我在确定具有我需要容纳的动态文本的表或集合视图单元格的高度时使用的代码类似。

答案 1 :(得分:0)

我没有在原来的问题中指明它,但我会在这里解决。当人们想要水平滚动到文本的指定部分时,上面接受的答案提供了解决方案。但是,为了垂直滚动,需要类似于下面的解决方案 - 可能存在其他方法,但这对我有用。

请注意,我们不是从属性子字符串本身获取大小组件,而是从我们向其添加子字符串后的视图中获取大小。然后我们插入完整的字符串并强制滚动:

NSAttributedString* att_string = [[NSMutableAttributedString alloc] initWithString:mystring];
NSAttributedString* sub_string = [att_string attributedSubstringFromRange:NSMakeRange(0, highlight_begin_index)];

[the_view setAttributedText:attributedSubstring];

CGFloat jump_height = the_view.contentSize.height;

[the_view setAttributedText:att_string];
[the_view setContentOffset:CGPointMake(the_view.contentOffset.x,jump_height) animated:FALSE];