美文网首页
iOS自动计算高度的UITextView

iOS自动计算高度的UITextView

作者: OC笔记 | 来源:发表于2016-11-07 14:52 被阅读0次

    自定义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<NSKeyValueChangeKey,id> *)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

          本文链接:https://www.haomeiwen.com/subject/emdouttx.html