textView放在自定義cell里面-自適應高度


首先我講講我做的這個自定義cell,像箭頭部分這個label是共有的東西,展示的是一樣的,所以我弄了一個父類cell,根據右邊所需的不同展示方法,利用繼承來實現

在父類的layoutsuviews做約束的時候

  [self.fieldnameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.left.offset(10);
        make.centerY.equalTo(self);
    
    }];

標題label上下是居中於cell,與cell左邊有10邊距  然后我有個該cell的子類

- (void)layoutSubviews

{

    [super layoutSubviews];

    [self.valueOptionTextView mas_makeConstraints:^(MASConstraintMaker *make) {

        make.left.equalTo(self.fieldnameLabel.mas_right).offset(10);

        make.right.equalTo(self.uonLabel.mas_left).offset(-10);

        make.top.equalTo(self.contentView.mas_top).offset(10);

        make.bottom.equalTo(self.contentView.mas_bottom).offset(-10);

        

    }];

}

valueOptionTextView 是子類增加的一個值數據textView  這個textView點擊的時候會彈出一個選項框,選擇對應的值,,然后顯示在textView上面,但是出現
valueOptionTextView的值要是過長達到換行的長度,就會出現擋住標題label的情況

在初始化子類cell的時候我調用了[self layoutIfNeeded]  發現沒有用, 找了好久好久終於發現,要在父類cell里面的初始化cell方法里面調用  [self layoutIfNeeded]   

哦哦哦,差點講偏題了,我這次要講的是讓cell自適應文本框高度....  接下來開始講重點 :  

1,textView有個屬性 scrollEnabled  要設置為NO;

2,設置tableview的時候  添加這兩行代碼:

    self.tableView.rowHeight = UITableViewAutomaticDimension;

    self.tableView.estimatedRowHeight = 100;

3,textView的底部要和contentView底部有個約束

初始化cell

@implementation TemplateRichtextCell

- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
        
        UITextView *valueTextView = [[UITextView alloc]init];
        valueTextView.scrollEnabled = NO;
        valueTextView.textAlignment = NSTextAlignmentRight;
        valueTextView.textColor = [UIColor darkGrayColor];
        valueTextView.font = [UIFont systemFontOfSize:15];
        [self.contentView addSubview:valueTextView];
        self.valueTextView = valueTextView;
        self.valueTextView.delegate = self;
        
    }
    
    return self;
    
}

控件布局約束

- (void)layoutSubviews
{
    [super layoutSubviews];
    [self.valueTextView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.equalTo(self.fieldnameLabel.mas_right).offset(10);
        make.right.equalTo(self.uonLabel.mas_left).offset(-10);
        make.top.equalTo(self.contentView.mas_top).offset(10);
        make.bottom.equalTo(self.contentView.mas_bottom).offset(-10);
        
    }];
}

要實現動態輸入文字讓cell隨時更改高度 要用tableView beginUpdates和endUpdates兩方法進行刷新,那么要什么時候進行刷新呢?要達到實時,所以我想到

textViewDidChange代理方法,這個會在文字改變的時候一直調用,所以在這個代理方法里面進行刷新是最合適不過的了,那么,我們又怎么能拿到tableView來進行調用更新呢?

其實我們可以用while循環查找cell的父控件來找到tableView  所以嘍,就是這樣:

- (void)textViewDidChange:(UITextView *)textView
{
    CGRect bounds = textView.bounds;
//     計算 text view 的高度
    CGSize maxSize = CGSizeMake(bounds.size.width, CGFLOAT_MAX);
    CGSize newSize = [textView sizeThatFits:maxSize];
    bounds.size = newSize;
    textView.bounds = bounds;
    // 讓 table view 重新計算高度
    UITableView *tableView = [self tableView];
    [tableView beginUpdates];
    [tableView endUpdates];
}
- (UITableView *)tableView
{
    UIView *tableView = self.superview;
    while (![tableView isKindOfClass:[UITableView class]] && tableView) {
        tableView = tableView.superview;
    }
    return (UITableView *)tableView;
}

到此,完成自適應;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM