iOS:UITextView设置高度等于内容高度

时间:2014-11-04 16:39:06

标签: ios xcode uitextview sizetofit

我有一个禁用滚动的UITextView,我需要设置UITextView的高度以匹配文本内容的高度。我尝试了各种方法,发现互联网没有结果。这是我的UITextView布局代码:

-(void) viewDidLayoutSubviews {
    // UITextView is named jobDescrip
    jobDescrip.scrollEnabled = NO;
    [jobDescrip sizeToFit];
    [jobDescrip layoutIfNeeded];
}

我也在viewDidAppear:方法中尝试了这段代码。有人可以使用自动布局为iOS 7.0及更高版本的解决方案发布代码吗?

3 个答案:

答案 0 :(得分:1)

你试过这个吗?我添加了一个按钮,其动作方法中包含流动的代码,我可以看到高度已更改为文本高度。

CGSize size = [self.textView systemLayoutSizeFittingSize:self.textView.contentSize];
CGRect frame = self.textView.frame;
frame.size.height = size.height;
self.textView.frame = frame;

修改

我为superview约束添加了一个底部空间并将其设置为IBOutlet属性,然后在viewDidAppear中我更改了约束常量。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.textView.contentInset = UIEdgeInsetsZero;
    CGSize size = [self.textView systemLayoutSizeFittingSize:self.textView.contentSize];
    self.heightConstraint.constant -= size.height - self.textView.frame.size.height;
    self.textView.scrollEnabled = NO;
    [self.textView setNeedsUpdateConstraints];
}

答案 1 :(得分:1)

这些是处理用户输入文本时调整UITextView大小的库。

  1. CSGrowingTextView: 这是一个UITextView子类,根据其内容调整self的大小。这适用于自动布局和非自动布局。这通过以下属性和委托方法提供了对调整大小动画的更多控制。

    @property (nonatomic, readwrite) CSGrowDirection growDirection;
    @property (nonatomic, readwrite) NSTimeInterval growAnimationDuration;
    @property (nonatomic, readwrite) UIViewAnimationOptions;
    
    - (void)growingTextView:(CSGrowingTextView *)growingTextView willChangeHeight:(CGFloat)height;
    - (void)growingTextView:(CSGrowingTextView *)growingTextView didChangeHeight:(CGFloat)height;
    
  2. ResizableTextView:这又是一个UITextView子类,它封装了所有与大小相关的代码。这是基于autolayout的。这将搜索添加到textView的高度约束,并使用计算的内容大小对其进行更新。以下是示例用法。

    [self.view layoutIfNeeded];
    // do your own text change here.
    self.infoTextView.text = [NSString stringWithFormat:@"%@, %@", self.infoTextView.text, self.infoTextView.text];
    [self.infoTextView setNeedsUpdateConstraints];
    [self.infoTextView updateConstraintsIfNeeded];
    [UIView animateWithDuration:1 delay:0 options:UIViewAnimationOptionLayoutSubviews animations:^{
         [self.view layoutIfNeeded];
    } completion:nil]
    
  3. MBAutoGrowingTextView:这是基于自动布局的优雅解决方案之一。这个UITextView子类根据内容自动增长和缩小,并且可以通过最大和最小高度进行约束 - 所有这些都没有一行代码。

    1. Give appropriate horizontal constraint
    2. If you want textView to grow upwards, pin to bottom. Otherwise pin it to the top.
    3. To limit maximal height, add the height constant with relation "Less than or equal" to some maximum value.
    4. To limit minimal height, add the height constant with relation "Greater than or equal" to some minimum value.
    
  4. GrowingTextViewHandler:这是一个NSObject子类,它封装了用于调整UITextView大小的代码。此方法基于自动布局。处理UITextView子类的大小调整提供了更大的灵活性。首先,GrowingTextViewHandler不必担心处理UITextViewDelegates。其次,它适用于任何UITextView子类。

    /*You need to pin UITextView appropriately.
      1. Give appropriate horizontal constraint
      2. Give height constraint
      3. To grow upwards, give bottom constraint
         To grow downwards, give top constraint
         To grow both directions, pin it vertically center
    */
    
    @interface ViewController ()<UITextViewDelegate>
      @property (weak, nonatomic) IBOutlet UITextView *textView;
      @property (weak, nonatomic) IBOutlet NSLayoutConstraint *heightConstraint;
      @property (strong, nonatomic) GrowingTextViewHandler *handler;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
       [super viewDidLoad];
       self.handler = [[GrowingTextViewHandler alloc]initWithTextView:self.textView withHeightConstraint:self.heightConstraint];
       [self.handler updateMinimumNumberOfLines:3 andMaximumNumberOfLine:8];
      }
    
      - (void)textViewDidChange:(UITextView *)textView {
        [self.handler resizeTextViewWithAnimation:YES];
      }
     @end
    

答案 2 :(得分:0)

尝试将此行添加到您的方法中:

[jobDescrip.textContainer setSize:jobDescrip.frame.size];

并查看是否有效,如果没有,请尝试使用UILabel代替UITextView,将其numberOfLines设置为0,然后添加此方法:

- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel
{
    CGSize maxSize = CGSizeMake(215, 2000.0);
    CGSize newSize = [stringForTheLabel sizeWithFont:[UIFont systemFontOfSize:14.0]
                                   constrainedToSize:maxSize]; //Remember to ensure the font size is both the same in here, and in the label properties.
    return newSize.height;
}