iOS自动计算高度的UITextView

自定义TextView与其他人的不同点

在做自定义textView时,我发现很多人是使用boundingRectWithSize来计算textView的text的高度,从而更新textView的高度。其实这种做法是多余的。UITextView本身就是继承自UIScrollView的,所以UITextView本身是有一个contentSize的属性的。每当UITextView的高度发生变化,UITextView的contentSize属性的height就会发生变化,所以我根据这一点,使用KVO监听contentSize属性即可获得textView的最新高度。本文自定义的textView使用场景:UITableViewCell里自动计算行高的textView。

主要代码:

// KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if ([keyPath isEqualToString:@"contentSize"]) {
        [self configureTextViewFrame];
    }
}

// 计算textView的frame
- (void)configureTextViewFrame {
    // self的frame是初始化时定的,默认是父视图的高度
    // 只有当contentSize的高度小于self的高度时才需要计算高度,超出则不计算
    if (self.textView.contentSize.height < self.bounds.size.height) {
        CGRect rect = self.bounds;
        // textView扩展方向:向两边(默认);向下;向上
        switch (self.extendDirection) {
            case YSTextViewExtendDirectionBothsides:
                rect.origin.y = (rect.size.height - self.textView.contentSize.height) / 2.f;
                break;
            case YSTextViewExtendDirectionUpside:
                rect.origin.y = rect.size.height - self.textView.contentSize.height;
                break;
            case YSTextViewExtendDirectionDownside:
                rect.origin.y = 0;
                break;
        }
        rect.size.height = self.textView.contentSize.height;
        self.textView.frame = rect;
    } else {
        self.textView.frame = self.bounds;
        self.isExtending = NO;
    }
    CGRect textBounds = self.textView.bounds;
    textBounds.origin.x += 5.f;
    self.placeholderLabel.frame = textBounds;
}

调用示例:

// contentView模拟UITableViewCell的contentView
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(100, 200, 200, 100)];
    [self.view addSubview:contentView];
    contentView.backgroundColor = [UIColor lightGrayColor];

    YSExtendTextView *textView = [YSExtendTextView new];
    textView.frame = CGRectMake(15, 5, 170, 90);
    textView.extendDirection = YSTextViewExtendDirectionDownside;// 输入框延伸方向(默认是从中间向两边)
    textView.placeholder = @"请输入文字~";
    [contentView addSubview:textView];

喜欢该控件的朋友可以从github下载使用。
GitHub

你可能感兴趣的:(iOS自动计算高度的UITextView)