iOS 表格頭部視圖下拉放大+單元格重寫(xiě)圖文混排

效果展示

QQ20170925-155107-HD.gif

ViewController.m

#import "ViewController.h"
#import "Model.h"
#import "FrameModel.h"
#import "TableViewCell.h"
@property(nonatomic,strong)UIImageView *headImageView;//頭部圖片
@property(nonatomic,strong)UITableView *tableView;//列表
@property (nonatomic, strong) NSArray *InfoArray;//數(shù)組
//屏幕寬抵怎、高 宏定義
#define IPHONE_W ([UIScreen mainScreen].bounds.size.width)
#define IPHONE_H ([UIScreen mainScreen].bounds.size.height)
// 頭視圖高度
static CGFloat kImageOriginHight = 250;
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    //將視圖添加到界面上
    [self.view addSubview:self.tableView];
    [self.tableView addSubview:self.headImageView];
    
    //隱藏系統(tǒng)tableViewCell分割線(xiàn)
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    //隱藏垂直滾動(dòng)條
    self.tableView.showsVerticalScrollIndicator = NO;
    
    [self getInfo];
}
#pragma mark -- 滾動(dòng)視圖的代理方法
- (void)scrollViewDidScroll:(UIScrollView*)scrollView{
    /**
     *  關(guān)鍵處理:通過(guò)滾動(dòng)視圖獲取到滾動(dòng)偏移量從而去改變圖片的變化
     */
    //獲取滾動(dòng)視圖y值的偏移量
    CGFloat yOffset  = scrollView.contentOffset.y;
    NSLog(@"yOffset===%f",yOffset);
    CGFloat xOffset = (yOffset +kImageOriginHight)/2;
    
    if(yOffset < -kImageOriginHight) {
        CGRect f =self.headImageView.frame;
        f.origin.y= yOffset ;
        f.size.height=  -yOffset;
        f.origin.x= xOffset;
        //int abs(int i); // 處理int類(lèi)型的取絕對(duì)值
        //double fabs(double i); //處理double類(lèi)型的取絕對(duì)值
        //float fabsf(float i); //處理float類(lèi)型的取絕對(duì)值
        f.size.width=IPHONE_W + fabs(xOffset)*2;
        
        self.headImageView.frame= f;
    }
}
#pragma mark -- 表視圖代理
- (void)getInfo
{
    //實(shí)際開(kāi)發(fā)數(shù)據(jù)是網(wǎng)絡(luò)獲取到的九巡,這里模擬給出一個(gè)數(shù)據(jù)
    NSArray *array = @[
                       @{@"name" : @"aaa", @"icon" : @"icon", @"text" : @"這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容", @"picture" : @"hero.jpg"},
                       @{@"name" : @"bbb", @"icon" : @"icon", @"text" : @"這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容這里是內(nèi)容", @"picture" : @"hero.jpg"},
                       @{@"name" : @"ccccc", @"icon" : @"icon", @"text" : @"這里是內(nèi)容没讲,沒(méi)有配圖"},
                       @{@"name" : @"ddd", @"icon" : @"icon", @"picture" : @"hero.jpg"}];
    
    //解析數(shù)據(jù)懒豹,轉(zhuǎn)模型保存
    NSMutableArray *tempArray = [NSMutableArray array];
    for (NSDictionary *dict in array) {
        Model *model = [Model modelWithDict:dict];
        FrameModel *frameModel = [[FrameModel alloc] init];
        frameModel.model = model;
        [tempArray addObject:frameModel];
    }
    self.InfoArray = [tempArray copy];
    
    NSLog(@"%ld",_InfoArray.count);
}

#pragma mark - Table view data source
//組數(shù)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

//組中行數(shù)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.InfoArray.count;
}

//cell內(nèi)容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    TableViewCell *cell = [TableViewCell cellWIthTableView:tableView];
    
    cell.frameModel = self.InfoArray[indexPath.row];
    
    return cell;
}

//設(shè)置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    FrameModel *frameModel = self.InfoArray[indexPath.row];
    
    return frameModel.cellHeight;
}
#pragma mark -- get 初始化操作

-(UITableView *)tableView
{
    if (_tableView == nil)
    {
        _tableView= [[UITableView alloc]initWithFrame:CGRectMake(0,0,IPHONE_W,IPHONE_H)];
        _tableView.delegate=self;
        _tableView.dataSource=self;
        _tableView.backgroundColor= [UIColor lightGrayColor];
        //內(nèi)容由kImageOriginHight 處開(kāi)始顯示这溅。
        _tableView.contentInset=UIEdgeInsetsMake(kImageOriginHight,0,0,0);
    }
    return _tableView;
}

-(UIImageView *)headImageView
{
    if (_headImageView == nil)
    {
        _headImageView= [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"111.jpg"]];
        _headImageView.frame=CGRectMake(0, -kImageOriginHight,IPHONE_W,kImageOriginHight);
    }
    return _headImageView;
}

Model.h

#import <Foundation/Foundation.h>

@interface Model : NSObject

@property (nonatomic, copy) NSString *icon;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *text;
@property (nonatomic, copy) NSString *picture;

- (id)initWithDict:(NSDictionary *)dict;
+ (id)modelWithDict:(NSDictionary *)dict;

@end

Model.m

#import "Model.h"

@implementation Model

- (id)initWithDict:(NSDictionary *)dict
{
    self = [super init];
    if (self) {
        [self setValuesForKeysWithDictionary:dict];
    }
    return self;
}

+ (id)modelWithDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}

@end

FrameModel.h

@class Model;

@interface FrameModel : NSObject

@property (nonatomic, assign) CGRect iconFrame;
@property (nonatomic, assign) CGRect nameFrame;
@property (nonatomic, assign) CGRect textFrame;
@property (nonatomic, assign) CGRect pictureFrame;
@property (nonatomic, assign) CGFloat cellHeight;
@property (nonatomic, strong) Model *model;

@end

FrameModel.m

#import "FrameModel.h"

#import "Model.h"

#define mainW [UIScreen mainScreen].bounds.size.width
#define HWTextFont [UIFont systemFontOfSize:15]

@implementation FrameModel

- (void)setModel:(Model *)model
{
    _model = model;
    
    //頭像
    CGFloat padding = 10;
    CGFloat iconWH = 30;
    self.iconFrame = CGRectMake(padding, padding, iconWH, iconWH);
    
    //名字
    CGSize nameSize = [self sizeWithText:model.name font:HWTextFont maxSize:CGSizeMake(MAXFLOAT, MAXFLOAT)];
    CGFloat nameW = nameSize.width;
    CGFloat nameH = nameSize.height;
    CGFloat nameX = CGRectGetMaxX(self.iconFrame) + padding;
    CGFloat nameY = CGRectGetMinY(self.iconFrame);
    self.nameFrame = CGRectMake(nameX, nameY, nameW, nameH);
    
    //文字內(nèi)容
    CGSize textSize = [self sizeWithText:model.text font:HWTextFont maxSize:CGSizeMake(mainW - padding * 2, MAXFLOAT)];
    self.textFrame = CGRectMake(padding, iconWH + padding * 2, textSize.width, textSize.height);
    
    //配圖
    if (model.picture) {
        self.pictureFrame = CGRectMake(padding, CGRectGetMaxY(self.textFrame) + padding, 120, 120);
        _cellHeight = CGRectGetMaxY(self.pictureFrame) + padding;
    }
    else {
        _cellHeight = CGRectGetMaxY(self.textFrame) + padding;
    }
}

//根據(jù)字體大小、限定長(zhǎng)度動(dòng)態(tài)獲取文字寬高尺寸
- (CGSize)sizeWithText:(NSString *)text font:(UIFont *)font maxSize:(CGSize)maxSize
{
    NSDictionary *dict = @{NSFontAttributeName : font};
    return [text boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;
}

TableViewCell.h

#import <UIKit/UIKit.h>

@class FrameModel;

@interface TableViewCell : UITableViewCell

@property (nonatomic, strong) FrameModel *frameModel;

+ (instancetype)cellWIthTableView:(UITableView *)tableView;

@end

TableViewCell.m

#import "TableViewCell.h"
#import "Model.h"
#import "FrameModel.h"

#define HWTextFont [UIFont systemFontOfSize:15]

@interface TableViewCell ()

@property (nonatomic, weak) UIImageView *icon;
@property (nonatomic, weak) UILabel *name;
@property (nonatomic, weak) UILabel *text;
@property (nonatomic, assign) UIImageView *picture;

@end

@implementation TableViewCell
+ (instancetype)cellWIthTableView:(UITableView *)tableView
{
    //cell復(fù)用,唯一標(biāo)識(shí)
    static NSString *identifier = @"HWCell";
    //先在緩存池中取
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    //緩存池中沒(méi)有再創(chuàng)建鹦付,并添加標(biāo)識(shí)昆禽,cell移出屏幕時(shí)放入緩存池以復(fù)用
    if (cell == nil) {
        cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    
    return cell;
}

//重寫(xiě)init方法構(gòu)建cell內(nèi)容
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        //取消點(diǎn)擊高亮狀態(tài)
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        
        //頭像
        UIImageView *icon = [[UIImageView alloc] init];
        [self.contentView addSubview:icon];
        self.icon = icon;
        
        //名字
        UILabel *name = [[UILabel alloc] init];
        name.font = HWTextFont;
        [self.contentView addSubview:name];
        self.name = name;
        
        //內(nèi)容
        UILabel *text = [[UILabel alloc] init];
        text.numberOfLines = 0;
        text.font = HWTextFont;
        [self.contentView addSubview:text];
        self.text = text;
        
        //配圖
        UIImageView *picture = [[UIImageView alloc] init];
        [self.contentView addSubview:picture];
        self.picture = picture;
    }
    
    return self;
}

//重寫(xiě)set方法蝗蛙,模型傳遞
- (void)setFrameModel:(FrameModel *)frameModel
{
    _frameModel = frameModel;
    
    Model *model = frameModel.model;
    
    self.icon.image = [UIImage imageNamed:model.icon];
    self.icon.frame = frameModel.iconFrame;
    
    self.name.text = model.name;
    self.name.frame = frameModel.nameFrame;
    
    self.text.text = model.text;
    self.text.frame = frameModel.textFrame;
    
    self.picture.image = [UIImage imageNamed:model.picture];
    self.picture.frame = frameModel.pictureFrame;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市为狸,隨后出現(xiàn)的幾起案子歼郭,更是在濱河造成了極大的恐慌,老刑警劉巖辐棒,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件病曾,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡漾根,警方通過(guò)查閱死者的電腦和手機(jī)泰涂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)辐怕,“玉大人逼蒙,你說(shuō)我怎么就攤上這事〖氖瑁” “怎么了是牢?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵僵井,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我驳棱,道長(zhǎng)批什,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任社搅,我火速辦了婚禮驻债,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘形葬。我一直安慰自己合呐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布笙以。 她就那樣靜靜地躺著淌实,像睡著了一般。 火紅的嫁衣襯著肌膚如雪猖腕。 梳的紋絲不亂的頭發(fā)上翩伪,一...
    開(kāi)封第一講書(shū)人閱讀 49,874評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音谈息,去河邊找鬼缘屹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侠仇,可吹牛的內(nèi)容都是我干的轻姿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼逻炊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼互亮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起余素,我...
    開(kāi)封第一講書(shū)人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤豹休,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后桨吊,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體威根,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年视乐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洛搀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佑淀,死狀恐怖留美,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤谎砾,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布逢倍,位于F島的核電站,受9級(jí)特大地震影響景图,放射性物質(zhì)發(fā)生泄漏瓶堕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一症歇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谭梗,春花似錦忘晤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至远舅,卻和暖如春闰蛔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背图柏。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工序六, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蚤吹。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓例诀,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親裁着。 傳聞我的和親對(duì)象是個(gè)殘疾皇子繁涂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 前言 最近忙完項(xiàng)目比較閑,想寫(xiě)一篇博客來(lái)分享一些自學(xué)iOS的心得體會(huì)二驰,希望對(duì)迷茫的你有所幫助扔罪。博主非科班出身,一些...
    GitHubPorter閱讀 1,422評(píng)論 9 5
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中桶雀。矿酵。。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的矗积,畢竟多個(gè)單...
    yhtang閱讀 5,174評(píng)論 1 23
  • NO.1 曾經(jīng)的她漠魏,像個(gè)快樂(lè)的天使倔矾。有著銀鈴般的笑聲,只要她一開(kāi)口,我們都忍不住說(shuō): 小喇叭又開(kāi)始廣播啦哪自! 不知道...
    陽(yáng)光Sunflower閱讀 2,257評(píng)論 0 1
  • 我喜歡寫(xiě)云丰包,你看 今天的云端又多了幾座廟宇 倒映在水中的層層石階 緩緩而上 滿(mǎn)眼的落葉和荒蕪 是我曾經(jīng)喜愛(ài)的地方 ...
    陶墨墨閱讀 850評(píng)論 8 2