0

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

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

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

4

3 回答 3

1

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

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

编辑

我在超级视图约束中添加了一个底部空间并将其设置为 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];
}
于 2014-11-05T04:42:45.903 回答
1

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

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

    @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 子类,它封装了所有改变大小的相关代码。这是基于自动布局的。这将搜索添加到 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
    
于 2015-06-03T11:42:23.420 回答
0

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

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

看看它是否有效,如果没有,请尝试使用 aUILabel而不是 a UITextView,将其设置numberOfLines0,然后添加此方法:

- (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;
}
于 2014-11-04T17:04:20.723 回答