UITextView sizeToFit无法正常工作

奇怪的是,我一直在寻找这个答案,但似乎没有任何效果!

我有简单的UITextView ,我试图根据其内容在viewController中resize:

 - (void)viewDidLoad { [super viewDidLoad]; NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; self.textView.text = lorum; self.textView.scrollEnabled = NO; [self.textView sizeToFit]; [self.textView layoutIfNeeded]; } 

但这就是我最终的结果:

在此处输入图像描述

我错过了一些明显的东西吗

更新(框架背景):

在此处输入图像描述

正如我在评论中写的,在我看来如果你不想使用UITextView的滚动我建议使用一个简单的UILabel ..这是代码:

编辑:如果你想出于某些原因使用UITextView,如可编辑文本或可选文本,你可以使用相同的代码进行一些修改(我在代码中添加此修改,如注释)

EDIT2,如果您的标签在故事板检查约束或删除autolayout

。H

  @interface ViewController : UIViewController { IBOutlet UILabel *label; } 

.M

  - (void)viewDidLoad { [super viewDidLoad]; // UILabel *label = [[UILabel alloc] init]; label.backgroundColor = [UIColor lightGrayColor]; NSString *lorum = @"Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; //for use labrect with UITextView you set the font of UITextView: //label.font = [UIFont systemFontOfSize:17]; CGSize maxSize = CGSizeMake(320, 410); CGRect labrect = [lorum boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:label.font} context:Nil]; label.text = lorum; //for use UITextView you should comment the line under label.numberOfLines = 0; label.frame = CGRectMake(0, 30, 320, labrect.size.height); // [self.view addSubview:label]; }; 

在此处输入图像描述

https://medium.com/ios-os-x-development/102e73853fbc

看看这个解决方案。 它对我有用!

您所要做的就是在故事板上添加一个高度约束,并在视图控制器中添加一个sockets。 然后将以下行添加到viewDidAppear方法:

CGSize size = self.textView.contentSize; self.textViewHeightConstraint.constant = size.height;

如果您点击链接,则有一个示例项目。

你尝试过使用UIViewContentMode吗?

例如:

 [self.textView setContentMode:UIViewContentModeScaleToFill]; 

尝试手动调整帧大小。

 self.textView.text = lorum; CGSize size = [lorum sizeWithFont:self.textView.font constrainedToSize:CGSizeMake(self.textView.frame.size.width, 9999) lineBreakMode:UILineBreakModeWordWrap]; CGRect frame = self.textView.frame; frame.size.width = size.width; frame.size.height = size.height; self.textView.frame = frame; 

这应该将textview的大小设置为文本的大小(约束到textView的宽度)。 原点应该保持不变。

据我所知sizeToFit只缩小框架,它不会扩展它。 因此,如果您的框架最初只有一条线高,它将只保留一条线。

或者,您可以将textView的框架设置为整个窗口,然后使用sizeToFit,这应该可以正常工作。

编辑:

要避免使用已弃用的function,也可以使用

 CGSize size = [lorum sizeWithAttributes:@{NSFontAttributeName:self.textView.font}]; 

要么

 CGRect rect = [text boundingRectWithSize:(CGSize){ .width = self.textView.frame.size.width, .height = CGFLOAT_MAX } options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName = self.textView.font } context:nil];