电影项目 (二)
显示界面如下 :(代码中有详细的注释)
代码如下 :
HomeViewController控制器代码:
// // HomeViewController.m // Movie 2.0 // // Created by mac1 on 15/10/8. // Copyright (c) 2015年 www.iphonetrain.com. All rights reserved. // #import "HomeViewController.h" #import "MovieModel.h" #import "MovieCell.h" #import "Common.h" static NSString *iden = @"Movie_Cell"; @interface HomeViewController () //海报视图 @property (nonatomic,strong)UIView *posterView; //电影列表视图 @property (nonatomic,strong)UITableView *listView; //存储Model @property (nonatomic, strong) NSMutableArray *movieData; @end @implementation HomeViewController - (void)viewDidLoad { [super viewDidLoad]; //加载数据 [self _loadData]; // iOS7 之后,状态栏默认穿透效果 translucent // 穿透 = YES,视图的起始点坐标 屏幕的左上角 // 穿透 = NO,视图的起始点坐标 导航栏下方左上角的点 // self.navigationController.navigationBar.translucent = NO; //设置导航栏上右侧按钮 [self _createNavigationRightItem]; //创建海报视图 [self _createPosterView]; //创建电影列表视图 [self _createListView]; //测试Appearance /* UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; button.frame = CGRectMake(40, 100, 100, 100); [button addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button]; */ UINib *nib = [UINib nibWithNibName:@"MovieCell" bundle:[NSBundle mainBundle]]; //注册xib创建的单元格 [_listView registerNib:nib forCellReuseIdentifier:iden]; //注意坐标问题 self.navigationController.navigationBar.translucent = NO; } //加载数据 - (void)_loadData{ //1.加载json文件 NSString *path = [[NSBundle mainBundle]pathForResource:@"new_movie" ofType:@"json"]; //2.将json文件转化为二进制数据 NSData NSData *data = [NSData dataWithContentsOfFile:path]; //系统提供的JSON序列化类 /* data : 要转换的json数据 options : 转换的选项. 1.NSJSONReadingMutableContainers 生成可变的对象 2.NSJSONReadingMutableLeaves 生成NSMutableString 3.NSJSONReadingAllowFragments 生成不可变的对象 */ /* 从对象 转换为 data options: NSJSONWritingPrettyPrinted 写入的对象格式很好看 */ //3.解析二进制数据 (系统提供的JSON序列化类) NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; //NSLog(@"dic = %@",dic); //4.把字典转换为model _movieData = [NSMutableArray array]; //把字典转换为model //取到subjects数组 NSArray *subjects = [dic objectForKey:@"subjects"]; // subjects数组中,每一个小字典,都是一条数据(model) for (int i = 0; i < subjects.count; i++) { //一条数据 NSDictionary *movieDic = subjects[i]; //构造model对象 MovieModel *model = [[MovieModel alloc] init]; // model对象的属性赋值 model.rating = [movieDic objectForKey:@"rating"]; model.genres = [movieDic objectForKey:@"genres"]; model.collect_count = [[movieDic objectForKey:@"collect_count"] integerValue]; model.title = [movieDic objectForKey:@"title"]; model.year = [movieDic objectForKey:@"year"]; model.images = [movieDic objectForKey:@"images"]; [self.movieData addObject:model]; } } //创建导航栏上右侧按钮 - (void)_createNavigationRightItem{ //1.创建父视图 UIView *rightView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 50, 30)]; rightView.tag = 1000; UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithCustomView:rightView]; self.navigationItem.rightBarButtonItem = rightItem; // 2.创建两个子视图 //列表 UIButton *button1 = [UIButton buttonWithType:UIButtonTypeCustom]; button1.frame = CGRectMake(1, 2, 48, 26); [button1 setImage:[UIImage imageNamed:@"list_home"] forState:UIControlStateNormal]; [button1 setBackgroundImage:[UIImage imageNamed:@"exchange_bg_home"] forState:UIControlStateNormal]; [button1 addTarget:self action:@selector(rightButtonAction:) forControlEvents:UIControlEventTouchUpInside]; button1.tag = 1001; button1.hidden = YES; [rightView addSubview:button1]; //海报 UIButton *button2 = [UIButton buttonWithType:UIButtonTypeCustom]; button2.frame = CGRectMake(1, 2, 48, 26); [button2 setImage:[UIImage imageNamed:@"poster_home"] forState:UIControlStateNormal]; [button2 setBackgroundImage:[UIImage imageNamed:@"exchange_bg_home"] forState:UIControlStateNormal]; [button2 addTarget:self action:@selector(rightButtonAction:) forControlEvents:UIControlEventTouchUpInside]; button2.tag = 1002; button2.hidden = NO; [rightView addSubview:button2]; } //创建海报视图 - (void)_createPosterView{ _posterView = [[UIView alloc] initWithFrame:self.view.bounds]; _posterView.backgroundColor = [UIColor orangeColor]; _posterView.hidden = NO; [self.view addSubview:_posterView]; } //创建列表视图 - (void)_createListView { //NSLog(@"bounds = %@", NSStringFromCGRect(self.view.bounds)); CGRect frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight - kTabBarHeight - kNavigationBarHeight); _listView = [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain]; _listView.backgroundColor = [UIColor clearColor]; _listView.hidden = YES; _listView.dataSource = self; // _listView.rowHeight = 100; _listView.delegate = self; [self.view addSubview:_listView]; } #pragma mark - buttonAction - (void)rightButtonAction:(UIButton *)sender { //获取到需要翻转的两个button UIButton *button1 = (UIButton *)[self.navigationController.navigationBar viewWithTag:1001]; UIButton *button2 = (UIButton *)[self.navigationController.navigationBar viewWithTag:1002]; UIView *rightView = [self.navigationController.navigationBar viewWithTag:1000]; //设置翻转的选项 BOOL flag = button1.hidden; //三目运算符 UIViewAnimationOptions flipOption = flag ? UIViewAnimationOptionTransitionFlipFromLeft : UIViewAnimationOptionTransitionFlipFromLeft; /* UIViewAnimationOptions flipOption; if (flag) { flipOption = UIViewAnimationOptionTransitionFlipFromLeft; } else { flipOption = UIViewAnimationOptionTransitionFlipFromLeft; } */ //翻转动画 button1.hidden = !button1.hidden; button2.hidden = !button2.hidden; //切换海报和列表视图 _posterView.hidden = !_posterView.hidden; _listView.hidden = !_listView.hidden; //设置动画1 [UIView transitionWithView:rightView duration:.35 options:flipOption animations:^{ } completion:^(BOOL finished) { //动画完成执行的动画 }]; //设置动画2 [UIView transitionWithView:self.view duration:.35 options:flipOption animations:^{ ; } completion:^(BOOL finished) { ; }]; } #pragma mark - 表视图的数据源方法 //列数 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } //行数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.movieData.count; } //创建单元格 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MovieCell *cell = [tableView dequeueReusableCellWithIdentifier:iden]; //注册就不需要这些 // // if (cell == nil) { // // //加载xib单元格 (注意取出来是数组) // cell = [[[NSBundle mainBundle]loadNibNamed:@"MovieCell" owner:self options:nil] lastObject]; // // } //将解析之后的数据交给单元格显示 MovieModel *model = self.movieData [indexPath.row]; cell.model = model; return cell; } //设置单元格的高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 100; } @end
MovieModel模型代码 :
// // MovieModel.h // Movie 2.0 // // Created by mac1 on 15/10/8. // Copyright (c) 2015年 www.iphonetrain.com. All rights reserved. // #import <Foundation/Foundation.h> @interface MovieModel : NSObject @property (nonatomic, strong) NSDictionary *rating; //评分 @property (nonatomic, strong) NSArray *genres; //类型 @property (nonatomic, assign) NSUInteger collect_count; //收藏数 @property (nonatomic, copy) NSString *title; //标题 @property (nonatomic, copy) NSString *original_title; @property (nonatomic, copy) NSString *year; //年份 @property (nonatomic, strong) NSDictionary *images; //图片 @end /* { "rating": { "max": 10, "average": 7.4, "stars": "40", "min": 0 }, "genres": [ "喜剧", "奇幻", "古装" ], "collect_count": 61872, "casts": [ { "avatars": { "small": "http://img4.douban.com/img/celebrity/small/21559.jpg", "large": "http://img4.douban.com/img/celebrity/large/21559.jpg", "medium": "http://img4.douban.com/img/celebrity/medium/21559.jpg" }, "alt": "http://movie.douban.com/celebrity/1275542/", "id": "1275542", "name": "白百何" }, ], "title": "捉妖记", "original_title": "捉妖记", "subtype": "movie", "directors": [ { "avatars": { "small": "http://img4.douban.com/img/celebrity/small/42488.jpg", "large": "http://img4.douban.com/img/celebrity/large/42488.jpg", "medium": "http://img4.douban.com/img/celebrity/medium/42488.jpg" }, "alt": "http://movie.douban.com/celebrity/1287124/", "id": "1287124", "name": "许诚毅" } ], "year": "2015", "images": { "small": "http://img4.douban.com/view/movie_poster_cover/ipst/public/p2257944916.jpg", "large": "http://img4.douban.com/view/movie_poster_cover/lpst/public/p2257944916.jpg", "medium": "http://img4.douban.com/view/movie_poster_cover/spst/public/p2257944916.jpg" }, "alt": "http://movie.douban.com/subject/25723907/", "id": "25723907" } */
单元格是用xib画出来的.
MovieCell代码如下 :
// // MovieCell.m // Movie 2.0 // // Created by mac1 on 15/10/8. // Copyright (c) 2015年 www.iphonetrain.com. All rights reserved. // #import "MovieCell.h" #import "MovieModel.h" #import "UIImageView+WebCache.h" @implementation MovieCell //视图是xib文件创建会调用此方法 - (void)awakeFromNib{ //取消单元格的选中效果 self.selectionStyle = UITableViewCellSelectionStyleNone; //清除单元格背景颜色 self.backgroundColor = [UIColor clearColor]; } - (void)setModel:(MovieModel *)model{ _model = model; //1.单元格显示内容 _titlelabel.text = model.title; //2.年份 _yearLabel.text = [NSString stringWithFormat:@"上映年份 : %@", model.year]; //图片地址字符串 NSString *imageName = [model.images objectForKey:@"medium"]; //URL NSURL *imageUrl = [NSURL URLWithString:imageName]; ; //3.利用SDWebImaage设置网络图片 [_postImageView sd_setImageWithURL:imageUrl]; } @end
在编写代码过程中,有个错误纠结了好长时间,程序一直崩溃.运行提示错误是xib加载key没有value,找了好久的错误,原来原因是:自己给控件连线的时候选的是File's owner.....正确的应该是选择当前的单元格.
后面的页面框架界面每天都会有更新哟....这是监督自己复习的很好的方法,也是为找工作的很好的准备!!!