使用第三方《UITableView+FDTemplateLayoutCell》自動計算UITableViewCell高度(Masonry約束)

来源:https://www.cnblogs.com/xuzb/archive/2018/04/03/8706737.html
-Advertisement-
Play Games

直接上代碼: 1:先自定義cell .h文件中 .m文件中 2:在控制器.m文件中使用 ...


直接上代碼:

1:先自定義cell

.h文件中

#import <UIKit/UIKit.h>
#import "LBDNewMsgListModel.h"
#import "MLEmojiLabel.h"

@interface LBDMsgCenterCell : UITableViewCell<MLEmojiLabelDelegate, UIGestureRecognizerDelegate>

@property (nonatomic, strong) UILabel *msgDateLbl;
@property (nonatomic, strong) UIView *bgView;
@property (nonatomic, strong) UIView *topLineView;
@property (nonatomic, strong) UIImageView *msgImgView;
@property (nonatomic, strong) UILabel *titleLbl;
@property (nonatomic, strong) UILabel *orderNum;
@property (nonatomic, strong) UIView *lineView;
@property (nonatomic, strong) UILabel *lookLbl;
@property (nonatomic, strong) MLEmojiLabel *contentLbl;

@property (nonatomic, strong) LBDNewMsgListModel *model;

@end

.m文件中

#import "LBDMsgCenterCell.h"
#import "LBDNewMsgListModel.h"
#import "NSDate+Extend.h"

@implementation LBDMsgCenterCell

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        
        [self createView];
        [self setSubviews];
    }
    return self;
}


#pragma make 創建子控制項

- (void)createView
{
    
    _msgDateLbl = [[UILabel alloc] init];
    _msgDateLbl.font = [UIFont systemFontOfSize:10];
    _msgDateLbl.textColor = [UIColor colorWithHex:@"646464"];
    _msgDateLbl.textAlignment = NSTextAlignmentCenter;
    [self.contentView addSubview:_msgDateLbl];
    
    _bgView = [[UIView alloc] init];
    _bgView.backgroundColor = [UIColor whiteColor];
    _bgView.layer.masksToBounds = YES;
    _bgView.layer.cornerRadius = 10;
    [self.contentView addSubview:_bgView];
    
    _msgImgView = [[UIImageView alloc] init];
    _msgImgView.hidden = YES;
    _msgImgView.contentMode = UIViewContentModeScaleToFill;
    [_bgView addSubview:_msgImgView];
    
    _topLineView = [[UIView alloc] init];
    _topLineView.hidden = YES;
    [_bgView addSubview:_topLineView];
    
    _titleLbl = [[UILabel alloc] init];
    _titleLbl.font = [UIFont systemFontOfSize:15];
    _titleLbl.numberOfLines = 0;
    _titleLbl.textColor = [UIColor colorWithHex:@"505050"];
    [_bgView addSubview:_titleLbl];
    
    _lookLbl = [[UILabel alloc] init];
    _lookLbl.textAlignment = NSTextAlignmentRight;;
    _lookLbl.text = @"立即查看";
    _lookLbl.font = [UIFont systemFontOfSize:13];
    [_bgView addSubview:_lookLbl];
    
    _lineView = [[UIView alloc] init];
    _lineView.backgroundColor = [UIColor unclickableColor];
    [_bgView addSubview:_lineView];
    
    [_bgView addSubview:self.contentLbl];
}


- (void)setModel:(LBDNewMsgListModel *)model
{
    NSDateFormatter *formater = [[NSDateFormatter alloc] init];
    formater.dateFormat = @"yyyy/MM/dd HH:mm";
    NSDate *sendDate  = [formater dateFromString:model.createdAt];
    if ([sendDate isToday]) {
        
        _msgDateLbl.text = [NSString stringWithFormat:@"今天 %@", [model.createdAt timestampTransformDateToType:@"HH:mm"]];
    } else if ([sendDate isYesToday]) {
        
        _msgDateLbl.text = [NSString stringWithFormat:@"昨天 %@", [model.createdAt timestampTransformDateToType:@"HH:mm"]];
    } else {
        
        _msgDateLbl.text = [model.createdAt timestampTransformDateToType:@"yyyy/MM/dd HH:mm"];
    }

    _titleLbl.text = model.title;
    self.contentLbl.text = model.content;

    [_bgView mas_remakeConstraints:^(MASConstraintMaker *make) {
        
        make.top.mas_equalTo(_msgDateLbl.mas_bottom);
        make.left.mas_equalTo(self.contentView.mas_left).offset(10);
        make.right.mas_equalTo(self.contentView.mas_right).offset(-10);
        make.bottom.mas_equalTo(self.contentView.mas_bottom);
    }];
    
    if ([model.colorType isEqualToString:@"1"]) {
        
        _topLineView.hidden = NO;
        _msgImgView.hidden = YES;
        [_msgImgView sd_setImageWithURL:nil];
        _topLineView.backgroundColor = [UIColor redColor];
        
        [_topLineView mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left);
            make.top.mas_equalTo(_bgView.mas_top);
            make.right.mas_equalTo(_bgView.mas_right);
            make.height.mas_equalTo(5);
        }];
        
        [_titleLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left).offset(10);
            make.right.mas_equalTo(_bgView.mas_right).offset(-10);
            make.top.mas_equalTo(_topLineView.mas_bottom).offset(6);
        }];
        
        [self.contentLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_titleLbl.mas_left);
            make.right.mas_equalTo(_titleLbl.mas_right);
            make.top.mas_equalTo(_titleLbl.mas_bottom).offset(8);
        }];
        
    } else if ([model.colorType isEqualToString:@"2"]) {
        
        _topLineView.hidden = NO;
        _msgImgView.hidden = YES;
        [_msgImgView sd_setImageWithURL:nil];
        _topLineView.backgroundColor = [UIColor colorWithHex:@"00ade5"];
        
        
        [_topLineView mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left);
            make.top.mas_equalTo(_bgView.mas_top);
            make.right.mas_equalTo(_bgView.mas_right);
            make.height.mas_equalTo(5);
        }];
        
        [_titleLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left).offset(10);
            make.right.mas_equalTo(_bgView.mas_right).offset(-10);
            make.top.mas_equalTo(_topLineView.mas_bottom).offset(6);
        }];
        
        [self.contentLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_titleLbl.mas_left);
            make.right.mas_equalTo(_titleLbl.mas_right);
            make.top.mas_equalTo(_titleLbl.mas_bottom).offset(8);
        }];
        
        
    } else if ([model.colorType isEqualToString:@"3"]) {
        
        _topLineView.hidden = YES;
        _msgImgView.hidden = NO;
        [_topLineView mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left);
            make.top.mas_equalTo(_msgDateLbl.mas_bottom);
            make.right.mas_equalTo(_bgView.mas_right);
            make.height.mas_equalTo(0);
        }];
        
        [_msgImgView sd_setImageWithURL:[NSURL URLWithString:model.activityImg] placeholderImage:[UIImage imageNamed:@"PersonalInformationImagePlaceholder"]];
        
        [_msgImgView mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left);
            make.right.mas_equalTo(_bgView.mas_right);
            make.top.mas_equalTo(_msgDateLbl.mas_bottom);
            make.height.mas_equalTo(SCREEN_WIDTH / 3.41);
        }];
        
        [_titleLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_bgView.mas_left).offset(10);
            make.right.mas_equalTo(_bgView.mas_right).offset(-10);
            make.top.mas_equalTo(_msgImgView.mas_bottom).offset(6);
        }];
        
        [_contentLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(_titleLbl.mas_left);
            make.right.mas_equalTo(_titleLbl.mas_right);
            make.top.mas_equalTo(_titleLbl.mas_bottom).offset(8);
        }];
        
    }
    
    if ([model.jump isEqualToString:@"0"]) {
        
        [_lineView mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(self.contentLbl.mas_left);
            make.right.mas_equalTo(self.contentLbl.mas_right);
            make.height.mas_equalTo(0);
            make.top.mas_equalTo(self.contentLbl.mas_bottom);
        }];
        
        [_lookLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.right.mas_equalTo(self.contentLbl.mas_right);
            make.width.mas_equalTo(80);
            make.height.mas_equalTo(0);
            make.top.mas_equalTo(_lineView.mas_bottom);
            make.bottom.mas_equalTo(_bgView.mas_bottom);
        }];
        
    } else if ([model.jump isEqualToString:@"1"]) {
        
        [_lineView mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(self.contentLbl.mas_left);
            make.right.mas_equalTo(self.contentLbl.mas_right);
            make.height.mas_equalTo(0.5);
            make.top.mas_equalTo(self.contentLbl.mas_bottom);
        }];
        
        [_lookLbl mas_remakeConstraints:^(MASConstraintMaker *make) {
            
            make.right.mas_equalTo(self.contentLbl.mas_right);
            make.width.mas_equalTo(100);
            make.height.mas_equalTo(30);
            make.top.mas_equalTo(_lineView.mas_bottom);
            make.bottom.mas_equalTo(_bgView.mas_bottom);
        }];
        
    }
    
}

- (void)setSubviews
{
    
    [_msgDateLbl mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.left.mas_equalTo(self.contentView.mas_left);
        make.top.mas_equalTo(self.contentView.mas_top);
        make.right.mas_equalTo(self.contentView.mas_right);
        make.height.mas_equalTo(30);
    }];
}


#pragma mark - delegate

- (void)mlEmojiLabel:(MLEmojiLabel*)emojiLabel didSelectLink:(NSString*)link withType:(MLEmojiLabelLinkType)type
{
    switch(type){
        case MLEmojiLabelLinkTypeURL:
            
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:link]];
            break;
        case MLEmojiLabelLinkTypePhoneNumber:
            
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", link]]];
            break;
        case MLEmojiLabelLinkTypeEmail:
            
            [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat:@"mailto:%@", link]]];
            break;
        case MLEmojiLabelLinkTypeAt:
            NSLog(@"點擊了用戶%@",link);
            break;
        case MLEmojiLabelLinkTypePoundSign:
            NSLog(@"點擊了話題%@",link);
            break;
        default:
            NSLog(@"點擊了不知道啥%@",link);
            break;
    }
    
}

- (MLEmojiLabel *)contentLbl
{
    if (!_contentLbl) {
        
        _contentLbl = [MLEmojiLabel new];
        _contentLbl.numberOfLines = 0;
        _contentLbl.font = [UIFont systemFontOfSize:13.0f];
        _contentLbl.delegate = self;
        _contentLbl.backgroundColor = [UIColor whiteColor];
        _contentLbl.lineBreakMode = NSLineBreakByTruncatingTail;
        _contentLbl.textColor = [UIColor colorWithHex:@"a0a0a0"];
        _contentLbl.disableEmoji = NO;
        _contentLbl.lineSpacing = 3.0f;
        _contentLbl.verticalAlignment = TTTAttributedLabelVerticalAlignmentCenter;
        
    }
    return _contentLbl;
}

 

2:在控制器.m文件中使用

- (void)drawView
{
    _tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
    _tableView.backgroundColor = [UIColor bgColor];
    _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    _tableView.delegate = self;
    _tableView.dataSource = self;
    [self addSubview:_tableView];
    
    // 給一個標識符,告訴tableView要創建哪個類
    [_tableView registerClass:[LBDMsgCenterCell class] forCellReuseIdentifier:@"LBDMsgCenterCell"];
    
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [self.tableView fd_heightForCellWithIdentifier:@"LBDMsgCenterCell" cacheByIndexPath:indexPath configuration:^(LBDMsgCenterCell *cell) {
        
        // 在這個block中,重新cell配置數據源
        [self setupModelOfCell:cell atIndexPath:indexPath];
    }];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _msgArr.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    LBDMsgCenterCell *cell = [tableView dequeueReusableCellWithIdentifier:@"LBDMsgCenterCell"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.backgroundColor = [UIColor clearColor];
    [self setupModelOfCell:cell atIndexPath:indexPath];
    
    return cell;
}

- (void)setupModelOfCell:(LBDMsgCenterCell *) cell atIndexPath:(NSIndexPath *) indexPath {

    // 採用計算frame模式還是自動佈局模式,預設為NO,自動佈局模式
    //    cell.fd_enforceFrameLayout = NO;
    cell.model = _msgArr[indexPath.row];
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在測試工作中,有時需要測試資料庫數據經過sql計算後的結果是否滿足某一功能查詢得到的返回值。 針對某些需要功能需要聯查多張表,此時 關聯 的作用就異常重要了,而針對多表關聯,其中 關聯條件的重要性不言而喻, 不同的關聯條件會得到不同的結果集。 廢話不多說,下麵開始做個實驗。 建表 data_stoc ...
  • 當我們的資料庫伺服器遇到如下的錯誤:ERROR: Too many connections 一種可能性就是我們的壓力確實很大,需要增加伺服器硬體資源或者增加資料庫伺服器。但是大多數情況下是我們的連接數配置不合理造成的。 在MySQL中,有如下幾個參數是和連接數配置相關的: Max_connectio ...
  • 車輛違規信息表testmodel_test 表結構: 表欄位:cra_id(車牌號),if_weigui(該次行駛是否違規,0是正常,1是違規) 目的: 查詢表中共有幾輛車,違規的有幾輛車; 方法1 SELECT COUNT(f.cra_id) carNum, SUM(f.weigui) weigu ...
  • 編程萌新,因為遇到這麼個SQL 查詢的問題:在一張表A里有如下欄位:學生姓名、學科名、學科成績。寫一條SQL 語句查出各科平均成績並按學生姓名分組,按如下格式顯示:學生姓名|語文|數學|英語。一開始遇到的時候挺懵的,有印象但是卻忘了怎麼寫了,接下來就是查閱資料並親自上手測試是否可行~ 第一次代碼修修 ...
  • iCloud是一種面向消費者市場的雲存儲服務,蘋果公司已經做了大量的工作讓用戶能夠平滑過渡到iCloud,不過對開發者而言這意味著新的負擔。 怎樣使用iCloud? 你可以使用2種方式在你的應用中使用iCloud.如果你需要讓你的應用在不同設備上共用一些配置信息,你可以使用iCloud的鍵值對存儲, ...
  • vs後臺api控制器 post接收參數 HttpContext.Current.Request.Params["account"].ToString() 返回值為對象返回,as接收,類似值"{\"status\":\"ok\",\"token\":\"token\"}",而後再轉換成對象。 低版本的 ...
  • 添加插件 除提供的標準插件外,可直接在config.xml中書寫配置,然後編譯模板,在後臺能看到相關的插件了 ...
  • 核心代碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...