自定义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
网友评论