这是一个功能齐全的解决方案,适合任何想要的人!
** 假设您的内容大小不会超过 两个 文本视图的限制 **
此解决方案通过向视图添加两个 UITextView 并在它们之间拆分文本来工作。看起来很复杂,其实很简单!我刚刚写了一个非常详细的描述:)
第 1 步 - 将两个 UITextView 添加到您的视图中:
我在我的故事板中添加了我的。放置它们,使一个直接在另一个上方,它们之间没有空间。不用担心设置高度(我们稍后会设置)。
在视图上设置约束,以便它们从顶部和底部相互连接,并从所有其他侧面连接容器的周围边缘,包括您想要的填充。 即将第一个文本视图从顶部、左侧和右侧绑定到容器,然后从底部绑定到第二个文本视图。将第二个文本视图从底部、左侧和右侧连接到容器,并从顶部连接到第一个文本视图。这将确保它们在设置内容时适当地拉伸。
不要对视图的高度设置任何约束,或者如果必须(以避免来自约束检查器的警告),请将其中一个视图的高度设置为 >= 20 或类似的小数字。
禁用两个文本视图的滚动、弹跳和滚动指示器。此解决方案依赖于视图是固定的、不可滚动的高度,因此如果您希望内容滚动,您应该使用 UIScrollView 或 UITableViewCell 作为容器。
在您的视图控制器文件中为您的两个新文本视图创建 outlet,将它们命名为 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 步 - 设置容器视图高度:
将您的容器视图(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 是一个宏,我将它们设置为两个文本视图上方和下方的空间总和,在它们的容器内)。
就是这样!祝你好运。