OStack程序员社区-中国程序员成长平台

标题: ios - 如何根据框架的大小分隔 UIScrollView/UITextView 的字符串 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 17:22
标题: ios - 如何根据框架的大小分隔 UIScrollView/UITextView 的字符串

我目前正在尝试读取 RSS 提要并将长段落文本分离到启用分页的 UIScrollView 中。我需要将文本分成不同的页面,也就是适合每个页面的内容并将字符串分开。我不确定这样做是否有标准,我认为这是大多数 RSS 阅读应用程序在多个页面上分离信息的方式。有谁知道如何解决这个问题?在文本不适合并继续之前,我不想逐个字母地查看。

编辑:

这是一个好的开始,但是示例代码几乎遇到了我试图避免并且不知道如何解决的问题。此范围为 UITextView 计算不正确。我更改了字体,如下所示。一切都试图在 - (NSRange)visibleRangeOfTextViewUITextView *)textView 内计算。此方法由 -(void)adjustTextDisplay 调用,该方法在为 UITextView 设置文本后由外部类调用。我不知道为什么将内容大小设置为屏幕的框架大小不会限制 View (如下所示),也不知道为什么此方法将完整的字符串长度作为范围返回。



Best Answer-推荐答案


我将完整的(当然从上一页开始)文本设置为 textView 和 get the last displayed character position,而不是繁重的迭代计算。 .然后很容易执行快速向后搜索以截断单词/句子。


我有以下解决方案,跳过最后部分显示的行以避免滚动并使其看起来更好看,这是一个有点棘手的部分。您仍然需要移动 endCutIndex 以使其自动换行。

带有寻呼机但没有 TextView 的基础项目取自 here

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString * fullText = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";

    pageControlBeingUsed = NO;


    int pageNumber = 0;
    UIFont * theFont = [UIFont boldSystemFontOfSize:30];
    const CGSize charSize = [@"A" sizeWithFont:theFont];

    while (fullText.length > 0) {
        CGRect frame;
        frame.origin.x = self.scrollView.frame.size.width * (pageNumber++);
        frame.origin.y = 0;
        frame.size = self.scrollView.frame.size;

        UIView *subview = [[UIView alloc] initWithFrame:frame];

        UITextView * textView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, frame.size.width, frame.size.height)];
        textView.font = theFont;
        [subview addSubview:textView];
        [textView release];


        textView.text = fullText;

        CGRect bounds = textView.bounds;
        // - charSize.height to skip a partially visible line
        // - charSize.width*2 to skip annoying character still displayed at partially visible line
        CGPoint endPoint = CGPointMake(CGRectGetMaxX(bounds) - charSize.width*2, CGRectGetMaxY(bounds) - charSize.height);
        UITextPosition *start = [textView characterRangeAtPoint:bounds.origin].start;
        UITextPosition *end = [textView characterRangeAtPoint:endPoint].end;

        const int startCutIndex = [textView offsetFromPosition:textView.beginningOfDocument toPosition:start];
        const int endCutIndex =   [textView offsetFromPosition:textView.beginningOfDocument toPosition:end];

        NSString * cutText = [fullText substringToIndex:endCutIndex];
        textView.text = cutText;
        fullText = [fullText substringFromIndex:endCutIndex];

        [self.scrollView addSubview:subview];
        [subview release];

        NSLog(@"age (1-total) %d, start text index %d, end text index %d \ntext:%@", pageNumber, startCutIndex, endCutIndex, cutText);
    }

    const int totalPages = pageNumber;

    self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * totalPages, self.scrollView.frame.size.height);

    self.pageControl.currentPage = 0;
    self.pageControl.numberOfPages = totalPages;
}

这是 .h 文件的一部分:

@interface FCContentViewController : UIViewController <UIScrollViewDelegate, UITextViewDelegate>{
    UIPageControl *pageControl;   
    NSString *trunkedString;
    UITextView *bodyText;
}
@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) NSString *bodyTextString;

关于ios - 如何根据框架的大小分隔 UIScrollView/UITextView 的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13021253/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4