如何在ios中限制UITextView中的内容

如何在ios中限制UITextView中的内容,ios,split,pagination,uitextview,Ios,Split,Pagination,Uitextview,我想在不同视图的文本视图中加载长文本。当文本到达文本视图的末尾时,应将其分成若干页。下一个文本视图必须以文本的延续开始 我已经看过很多答案了。但all指定在输入数据时限制文本内容。我想在文本视图中显示分页数据。而且不会有任何输入或编辑。因此,与此相关的委托方法将不起作用 我试图加载固定长度的文本。但当段落数量不同时,这是不正确的 因此,我试图找到的是,当文本达到textview容量的末尾时,或根据无行/无字符数获得textview的容量时,得到通知。有没有办法做到这一点 更新 根据我得到的评论,

我想在不同视图的文本视图中加载长文本。当文本到达文本视图的末尾时,应将其分成若干页。下一个文本视图必须以文本的延续开始

我已经看过很多答案了。但all指定在输入数据时限制文本内容。我想在文本视图中显示分页数据。而且不会有任何输入或编辑。因此,与此相关的委托方法将不起作用

我试图加载固定长度的文本。但当段落数量不同时,这是不正确的

因此,我试图找到的是,当文本达到textview容量的末尾时,或根据无行/无字符数获得textview的容量时,得到通知。有没有办法做到这一点

更新

根据我得到的评论,我搜索了很多,并访问了NSTextStorage、NSTextLayoutManager和NSTextContainer

我发现这个链接将有助于轻松实现分页

在本例中,他们使用循环创建了4个对象。可以这样说,因为他们已将字符串拆分为4个部分,并在scrollview的4个UITextView中显示

我试图设置一个条件,根据字符串的长度拆分为textcontainers。 我试图通过考虑主字符串的总长度&文本视图中显示的文本来创建一个条件


但每个textview的文本长度与主字符串的总长度相同。因此,如何获得textview的每个文本容器中显示的文本长度???

使用以下方法:

 NSString *textEntered = [[[tvQuestion.text copy] autorelease] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

        //Added for 450 character restriction 
        if([textEntered length] > 450) {
            UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Message" message:kMoreThan450CharactersForQuestion delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [alertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES];
            [alertView release];
        }

将全部文本分配给所有文本视图如何。然后,当我们从一个文本移动到另一个文本视图时,我们只使用文本视图的以下功能

- (void)scrollRangeToVisible:(NSRange)range;

您将决定最初应该是什么范围,然后在每次迭代中不断更改它,直到到达字符串的末尾

不久前,为了在iOS 5上的UITextView中的某些单词上叠加视图,我不得不在UITextView中对文本进行测量。有了iOS 7的UITextView更改,我不再需要这样做了。我做测量的方式可能正是你分解文本所需要的。我没有一个好的工作代码,所以我必须尽我所能描述算法

当线条高度可变时,此算法不起作用

  • 通过试错,我发现我需要匹配的文本宽度是文本视图的宽度减去16
  • 对文本的子字符串执行二进制搜索,以查找适合UITexView的最大子字符串,其中子字符串在单词边界处断开。您可以使用NSLanguageTagger获取单词边界
  • 在每个子字符串上调用
    [substr sizeWithFont:font constrainedToSize:sizeconstrainedtlinebreakmode:NSLineBreakByWordWrapping]
    ,其中第1步中的宽度和非常大的高度中存在大小约束
  • 您将需要继续搜索,直到您能够识别单词边界,在该边界中,word1的带有约束的大小为您提供了适合您视图的高度,而紧接着的下一个单词为您提供了不适合您视图的高度。您将知道,UITextView将在这里进行文字包装,因为文字太大,无法放在您的某个页面上
  • 从第4步开始,在单词边界上打断文本,并在下一页执行相同的操作

  • 我利用图书馆做了类似的事情

    DTCoreText包含布局帮助器,可以方便地在列中剪切文本并创建不同的文本视图。我在github上创建了一个示例,展示了如何实现:

    希望有帮助这里有两个要素:

    关于ios 7文本工具包的多列说明/示例:

    基于该样本和以下问题:

    您可以尝试类似的方法:

    - (void)layoutTextContainers
    {
        NSUInteger lastRenderedGlyph = 0;
        CGFloat currentXOffset = 0;
        while (lastRenderedGlyph < _layoutManager.numberOfGlyphs) {
            CGRect textViewFrame = CGRectMake(currentXOffset, 10,
                                              CGRectGetWidth(self.view.bounds) / 2,
                                              CGRectGetHeight(self.view.bounds) - 20);
            CGSize columnSize = CGSizeMake(CGRectGetWidth(textViewFrame) - 20,
                                           CGRectGetHeight(textViewFrame) - 10);
    
            NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:columnSize];
            [_layoutManager addTextContainer:textContainer];
    
            // And a text view to render it
            UITextView *textView = [[UITextView alloc] initWithFrame:textViewFrame
                                                       textContainer:textContainer];
            textView.scrollEnabled = NO;
            [self.scrollView addSubview:textView];
    
    
    
            // Increase the current offset
            currentXOffset += CGRectGetWidth(textViewFrame);
    
            // And find the index of the glyph we've just rendered
            lastRenderedGlyph = NSMaxRange([_layoutManager glyphRangeForTextContainer:textContainer]);
    
            NSLog(@"Last rendered glyph %i",lastRenderedGlyph);
    
            NSLog(@"Textview length %i",textView.text.length);
    
            NSRange range = {lastRenderedGlyph-1, lastRenderedGlyph};
    
            NSRange glyphRange;
    
            // Convert the range for glyphs.
            [_layoutManager characterRangeForGlyphRange:range actualGlyphRange:&glyphRange];
    
            NSLog(@"Glyph rect %@",NSStringFromCGRect([_layoutManager boundingRectForGlyphRange:glyphRange inTextContainer:textContainer]));
        }
    
        // Need to update the scrollView size
        CGSize contentSize = CGSizeMake(currentXOffset, CGRectGetHeight(self.scrollView.bounds));
        self.scrollView.contentSize = contentSize;
    }
    
    Glyph Rect看起来不太好(我有兴趣看到它正常工作) 但是您将显示最新的图示符


    希望有帮助

    您可以创建CTFramesetter并调用CTFramesetterSuggestFrameSizeWithConstraints。然后,您将找到适合给定CGSize的文本范围。 然后根据范围操纵文本,就完成了


    参考-。

    选项2在具有适当参数的iOS中工作

    NSAttributedString *attrStr = ... // your attributed string
    CGFloat width = 300; // whatever your desired width is
    CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];
    
    如果选项参数没有正确的值,则会得到错误的高度


    得到这个答案,我认为你最好的选择不是看文本的长度,而是看高度。您可以从
    [NSString SizeWithatAttributes:(NSDictionary*)属性]
    中获得此特性。基于您的问题,您可能需要使用
    SizeWithatAttributes
    以及一些自定义的“chunkenizing”工具,pbb二进制搜索从何处裁剪字符串。我不确定这一点,但是,当评估何时移动到下一个TeXVIEW时,TeXVIEW的内容大小不应该是一个有效的值吗?我猜粘贴操作可能会造成问题。对,如果textView只能容纳50个字符(简单的情况下没有新行字符等),而你粘贴100个字符,你需要找到裁剪的位置。除非有某种方法可以在单独的方法中抓取粘贴操作,就像普通编辑操作一样,如果粘贴了300个字符呢?如果他们从textview 1中删除,textview 2中的文本是否会移回textview 1?请详细说明您的问题HI,以便我如何设置范围。我想要文本查看全文。当我手动设置范围时,它会随着段落数的变化而变化。你知道在textview中获取可见文本的长度吗??所以我可以通过测量来设定范围@卡拉纳兰加特我想说,尝试和错误应该给你这个最佳范围。因为在你得到一个好的答案之前,这是简单而快速的。我的应用程序有一个缺点
    NSAttributedString *attrStr = ... // your attributed string
    CGFloat width = 300; // whatever your desired width is
    CGRect rect = [attrStr boundingRectWithSize:CGSizeMake(width, 10000) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading context:nil];