0

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

当存在大量文本时,我目前必须手动滚动很多方法才能到达突出显示的部分。我想想出一种方法,让视图在加载视图时自动滚动到突出显示的部分——类似于如何使用锚链接到网页的特定部分

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

也许有更好的方法来实现这一点?

4

2 回答 2

1

UIScrollView具有setContentOffset:animated:允许您滚动到内容中特定点的方法。要确定适当的偏移量是多少,您必须确定属性字符串部分在突出显示部分之前的宽度。您可以在此处找到用于执行此操作的方法的文档。您可以size使用NSAttributedString.

它看起来像这样:

@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

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

    CGFloat height = [attributedSubstring boundingRectWithSize:CGSizeMake(<#fixed width to wrap at#>, HUGE_VALF) options:NSStringDrawingUsesLineFragmentOrigin context:nil].size.height;
    [_scrollView setContentOffset:CGPointMake(0.0f, height) animated:YES];

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

于 2013-08-11T23:48:19.107 回答
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];
于 2013-08-14T03:39:33.180 回答