在高度达到8192.0之后,UITextView文本变得不可见

我有一个不可滚动的UITextViewembedded在UIScrollView并dynamic地添加文本到UITextViewUIScrollView根据TextView的框架相应地调整它的contentSize。 但是,一旦UITextView超过8192的高度,文本将变得不可见(但仍然存在,因为您可以使用放大镜突出显示文本,甚至可以通过放大镜查看文本的部分内容)。

  CGRect textviewFrame = self.TextView.frame; textviewFrame.size.height = [self textViewHeightForAttributedText:self.TextView.attributedText andWidth:320.0]; self.TextView.frame = textviewFrame; self.ScrollView.contentSize = self.TextView.frame.size; 

帮助函数相应地调整UITextView大小:

 - (CGFloat)textViewHeightForAttributedText:(NSAttributedString *)text andWidth:(CGFloat)width { UITextView *textView = [[UITextView alloc] init]; [textView setAttributedText:text]; CGSize size = [textView sizeThatFits:CGSizeMake(width, FLT_MAX)]; return size.height; } 

没有意识到这是同样的确切的问题,这是没有解决,直到我明确地testing了最大的大小8193和问题发生(而最大尺寸8192仍然有文字显示正确)。 任何人遇到这个问题之前,知道工作? 谢谢

我最近受到这个问题的困扰,并找出了一个有效的解决方法。 虽然它看起来像一个iOS的错误恕我直言,这实际上不是…有CALayer大小的实际限制,再加上绘制一个8K高的文本需要很长的时间。 更好地做苹果的意图,并只呈现文本的位可见…这就是为什么UITextView扩展UIScrollView毕竟。

问题是,UITextView不是很容易与其他UI的集成。 在我的情况下,我正在使用单个UITextView呈现文章的新闻应用程序,另外还有一些单独的UI(标题和button等),它们都在一个可滚动的容器中。

我find的解决scheme是将UITextView分成两个视图…一个专门的UITextView容器,其框架是全文的大小(即与UITextView的contentSize相同的大小),这是UITextView的超级视图。 您的子UITextView的框架应该设置为外部可滚动容器的边界。

然后,你所要做的就是使用键值观察来监视外部可滚动容器视图的contentOffset属性(在我的情况下,这是一个UICollectionView)。 当contentOffset更改时,更新(1)UITextView的contentOffset,以及(2)UITextView图层的transform属性。 通过更新该转换属性,UITextView被修复,以填充它的超级视图的当前可见部分。 但是因为你也在更新UITextView的contentOffset,所以这个技巧对于用户是完全不可见的……它看起来和行为就好像UITextView非常大。

这是一个function完善的解决scheme,适合任何喜欢它的人!

**假设您的内容大小不会超过两个文本视图的限制**

这个解决scheme通过在你的视图中添加两个UITextView来工作,并在它们之间分割你的文本。 它看起来很复杂,但其实很简单! 我刚刚写了一个非常详细的说明:)

第1步 – 将两个UITextView添加到您的视图中:

我在故事板中添加了我的 把它们放在一个正上方,两者之间没有空隙。 不要担心设置高度(我们将在稍后设置)。

在视图上设置约束,使它们从顶部和底部彼此绑定,并从所有其他边缘(包括所需填充)包围容器的周围边缘。 即将第一个文本视图从顶部,左侧和右侧连接到容器,并从底部连接到第二个文本视图。 将第二个文本视图从底部,左侧和右侧绑定到容器,并从顶部将其绑定到第一个文本视图。 这将确保它们在内容设置时适当伸展。

不要在视图的高度上设置任何约束,或者如果您必须(为了避免约束检查器的警告),请将其中一个视图的高度设置为>= 20 ,或者设置一些类似的小数目。

为您的文本视图禁用滚动,反弹和滚动指示器。 这个解决scheme依赖于视图是一个固定的,不可滚动的高度,所以如果你希望你的内容滚动,你应该使用UIScrollView或UITableViewCell作为容器。

为您的视图控制器文件中的两个新文本视图创build出口,命名它们像textView1textView2

第2步 – 将textContainerInsets设置为零:

将两个文本视图的textContainerInset属性设置为零,或者使用用户定义的运行时属性:

或代码:

 self.textView1.textContainerInset = UIEdgeInsetsZero; self.textView2.textContainerInset = UIEdgeInsetsZero; 

这将确保在设置内容时两个视图之间不会出现可见的空间,并且不会影响视图周围的其他空间。

第3步 – 分割您的内容,设置它,并更新视图高度:

只需将以下代码复制到视图控制器文件( viewDidLoad )中,并将contentStringvariables设置为您的内容即可。

 /* Content is split across two UITextViews to avoid max drawing height */ NSString *contentString = @"Some very long piece of text..."; // Set text NSArray *components = [contentString componentsSeparatedByString:@"\n"]; NSInteger halfLength = [components count] / 2; NSArray *firstHalf = [components subarrayWithRange:NSMakeRange(0, halfLength)]; NSArray *secondHalf = [components subarrayWithRange:NSMakeRange(halfLength, [components count] - halfLength)]; NSString *contentString1 = [firstHalf componentsJoinedByString:@"\n"]; NSString *contentString2 = [secondHalf componentsJoinedByString:@"\n"]; self.textView1.text = contentString1; self.textView2.text = contentString2; // Set text view heights CGFloat fixedWidth1 = self.textView1.frame.size.width; CGFloat fixedWidth2 = self.textView2.frame.size.width; CGSize newSize1 = [self.textView1 sizeThatFits:CGSizeMake(fixedWidth1, CGFLOAT_MAX)]; CGSize newSize2 = [self.textView2 sizeThatFits:CGSizeMake(fixedWidth2, CGFLOAT_MAX)]; CGRect newFrame1 = self.textView1.frame; CGRect newFrame2 = self.textView2.frame; newFrame1.size = CGSizeMake(fmaxf(newSize1.width, fixedWidth1), MIN(newSize1.height, 8192)); newFrame2.size = CGSizeMake(fmaxf(newSize2.width, fixedWidth2), MIN(newSize2.height, 8192)); self.textView1.frame = newFrame1; self.textView2.frame = newFrame2; 

这段代码大致在中间拆分contentString,寻找最近的换行符。 如果您想将内容分成不同的字符,只需将所有出现的\n更改为您想要分割的内容即可。

第4步 – 设置您的容器视图高度:

设置你的容器视图(scrollView,tableViewCell,其他任何)到你的两个文本视图的高度,以及任何额外的空间,你已经设置了上下。

 CGRect viewFrame = self.myView.frame; viewFrame.size.height = MIN(self.textView1.frame.size.height, 8192) + MIN(self.textView2.frame.size.height, 8192) + kTextViewContainerPadding; [self.myView setFrame:viewFrame]; 

(在我的代码中,kTextViewContainerPadding是一个macros,我已经设置了它们的容器内的两个文本视图之上和之下的空间的总和)。

而已! 祝你好运。

你好,我想我不迟到了。 我得到了和你一样的问题。 这是我的解决scheme:

 textView.scrollEnabled = YES; contentTextView.attributedText = finalAttrString; // contentTextView.text = [attrString string]; contentTextView.font = kFont(contentTextFS + [valueOfStepper intValue]); [contentTextView sizeToFit]; contentTextView.height += 1;//This is the key code //contentTextView.height = 8192.0f 

他们解决了麻烦,我可以改变大小dynamicdynamic.Successfull在iOS 8上成功