UITextView sizeToFit无法正常工作

时间:2014-01-08 14:11:31

标签: ios objective-c

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

我有一个简单的UITextView,我试图根据其内容在viewController中调整大小:

- (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];
}

但这就是我最终的结果:

enter image description here

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

更新(框架背景):

enter image description here

4 个答案:

答案 0 :(得分:5)

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

编辑:如果您因某些原因(例如可编辑文本或可选文本)使用UITextView,您可以使用相同的代码进行一些修改(我在代码中添加此修改,如评论)

EDIT2 如果您的标签位于故事板检查约束或删除自动布局

·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];

  };

enter image description here

答案 1 :(得分:5)

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

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

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

  

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

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

答案 2 :(得分:0)

您是否尝试使用UIViewContentMode

例如:

[self.textView setContentMode:UIViewContentModeScaleToFill];

答案 3 :(得分:-1)

尝试手动调整帧大小。

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,这应该可以正常工作。

编辑:

为避免弃用功能,您还可以使用

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];
相关问题