如何在ios中限制UITextView中的内容
我想在不同视图的文本视图中加载长文本。当文本到达文本视图的末尾时,应将其分成若干页。下一个文本视图必须以文本的延续开始 我已经看过很多答案了。但all指定在输入数据时限制文本内容。我想在文本视图中显示分页数据。而且不会有任何输入或编辑。因此,与此相关的委托方法将不起作用 我试图加载固定长度的文本。但当段落数量不同时,这是不正确的 因此,我试图找到的是,当文本达到textview容量的末尾时,或根据无行/无字符数获得textview的容量时,得到通知。有没有办法做到这一点 更新 根据我得到的评论,我搜索了很多,并访问了NSTextStorage、NSTextLayoutManager和NSTextContainer 我发现这个链接将有助于轻松实现分页 在本例中,他们使用循环创建了4个对象。可以这样说,因为他们已将字符串拆分为4个部分,并在scrollview的4个UITextView中显示 我试图设置一个条件,根据字符串的长度拆分为textcontainers。 我试图通过考虑主字符串的总长度&文本视图中显示的文本来创建一个条件如何在ios中限制UITextView中的内容,ios,split,pagination,uitextview,Ios,Split,Pagination,Uitextview,我想在不同视图的文本视图中加载长文本。当文本到达文本视图的末尾时,应将其分成若干页。下一个文本视图必须以文本的延续开始 我已经看过很多答案了。但all指定在输入数据时限制文本内容。我想在文本视图中显示分页数据。而且不会有任何输入或编辑。因此,与此相关的委托方法将不起作用 我试图加载固定长度的文本。但当段落数量不同时,这是不正确的 因此,我试图找到的是,当文本达到textview容量的末尾时,或根据无行/无字符数获得textview的容量时,得到通知。有没有办法做到这一点 更新 根据我得到的评论,
但每个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更改,我不再需要这样做了。我做测量的方式可能正是你分解文本所需要的。我没有一个好的工作代码,所以我必须尽我所能描述算法 当线条高度可变时,此算法不起作用
[substr sizeWithFont:font constrainedToSize:sizeconstrainedtlinebreakmode:NSLineBreakByWordWrapping]
,其中第1步中的宽度和非常大的高度中存在大小约束我利用图书馆做了类似的事情 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];