我有嵌入在UITextView
非滚动UIScrollView
并添加文本UITextView
动态。该UIScrollView
调整它的contentSize因此基于的TextView的框架上。然而,一旦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;
}
不知道这是这是未解here直到我测试了它明确的强制最大尺寸8193和出现问题(而8192最大尺寸仍然显示正确的文本)完全相同的问题。任何人都碰上之前这个问题,并知道周围的工作吗?谢谢
我最近被这个问题击中,制定了围绕它的有效途径。虽然这似乎是一个iOS的错误恕我直言,这真的不是......有到CALayer的大小实际限制,再加上画一个8K高的文本块需要很长的时间。好多做苹果打算,并只呈现文本的位这是可见......这就是为什么UITextView的毕竟延伸的UIScrollView。
问题是,UITextView的是不是非常容易与UI的其他位整合。在我来说,我的工作的新闻应用程序在使用单一的UITextView呈现的文章,再加上有一些不同的UI(标题和按钮等)上方和下方,在一个可滚动容器中的所有主机。
我已经找到了解决方案是将UITextView的分成两个观点...专用的UITextView容器,其框架是全文尺寸(即大小相同的UITextView中的contentSize),并且是你的UITextView的上海华。你的孩子的UITextView的框架应设置为外滚动容器的边界。
然后,所有你需要做的就是使用键 - 值观察来监控您的外部滚动容器视图的contentOffset财产(对我来说,这是一个UICollectionView)。当其contentOffset改变了你的更新(1)你的UITextView的contentOffset,和(2)的UITextView的层的变换属性。通过更新变换属性的UITextView是固定的,以填补当前可见部分的是上海华。但是,因为你还更新的UITextView的contentOffset,这种挂羊头卖狗肉是完全不可见的用户...它的外观和行为仿佛UITextView的仅仅是非常大的。
这里是一个全功能的解决方案,任何人想它谁!
**假设你的内容的大小不会超过两个文本视图的限制**
该解决方案的工作原理是将两个UITextViews到您的视图,以及它们之间的分裂文本。它看起来很复杂,但它实际上是很简单的!我刚写了一个非常详细的描述:)
第1步 - 添加两个UITextViews到您的看法:
我说我的,我的故事板。将它们放置使得一个是直接在另一个之上,在它们之间没有空间。不要担心设置的高度(我们将设置更高版本)。
坐落于所有其他各方,包括所需填充的意见,使它们从顶部和底部绑在一起,和容器的周围边缘约束。即,从顶部,左侧,和右侧扎所述第一文本视图到容器上,并从底部起的第二文本视图。从底部扎第二文本视图到容器上,左,右,和从顶部的第一个文本视图。这将确保他们适当地伸展在内容设置。
不要设置上的意见高度的任何约束,或者如果你必须(避免约束检查警告),设置一个视图的高度是>= 20
,或者一些类似的小数目。
禁用滚动,弹跳和滚动为您的文本视图指标。该解决方案依赖于作为一个固定的,非滚动的高度的意见,所以如果你想你的内容进行滚动,你应该使用一个UIScrollView或作为的UITableViewCell的容器。
在您的视图控制器文件创建两个新文本视图网点,命名它们像textView1
和textView2
。
第2步 - 设置textContainerInsets为零:
对于文本意见textContainerInset属性设置为零,或者使用用户自定义运行属性:
或代码:
self.textView1.textContainerInset = UIEdgeInsetsZero;
self.textView2.textContainerInset = UIEdgeInsetsZero;
这将确保当内容被设定的不可见的空间将两种观点之间出现,而不会影响周围的意见另一方的间隔。
第3步 - 斯普利特您的内容,将其设置和更新视图高度:
只需将以下代码复制到您的视图控制器文件(viewDidLoad
),以及contentString
变量设置为您的内容。
/* 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步 - 设置你的容器视图高度:
设置你的容器视图(滚动视图,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是我设置为高于和低于我的两个文本的意见的空间和宏,它们的容器内)。
而已!祝好运。
尝试启用了滚动视图滚动。保持TextView的高度>内容的高度,所以,在现实中不会有滚动,但scrollEnabled应该是= YES
它解决了这个问题对我来说。
你好,我想我没有迟到回答。我得到了同样的问题,像你这样的。这是我的解决方案:
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
他们解决了我的麻烦,我可以在iOS 8改变大小dynamic.Successfull