百思不得姐第八天
上午
一:监听ScrollView停止两种方法
- 代码实现滚动的时候:必须要有动画
- 拖拽实现滚动的时候
二:ScrollView中,对应的X/Y宽高都相等的时候frmae就等一bounds
三:判断View是否在对应的View上面
1:判断父控件
2:看Window是否有值
3:是否创建加载
四:autormaticllyAdjustScrollViewInsets
五:内边距设置
1:tableView尺寸还是屏幕的尺寸(高度)
2:不被导航栏河tabBar挡住(用户能看齐所有内容)
3:能实现穿透效果
下午
六:实现步骤
---------------------------------------------------
1:发请求:获取服务器数据(导入AFNetWorking)
或者将返回的数据写成plist数据方便查看
1 NSString *url = @"http://api.budejie.com/api/api_open.php"; 2 3 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 4 dict[@"a"] = @"list"; 5 dict[@"c"] = @"data"; 6 dict[@"type"] = @1; //@"1"; 7 8 AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 9 self.manager = manager; 10 11 [_manager GET:url parameters:dict success:^void(NSURLSessionDataTask *data, id response) { 12 NSLog(@"%@", response); 13 } failure:^void(NSURLSessionDataTask *data, NSError *error) { 14 15 }];
这里我们需要创建网络请求的管理者
1 @property (nonatomic, strong) AFHTTPSessionManager *manager; 2 3 -(AFHTTPSessionManager *)manager 4 { 5 if (_manager == nil) { 6 _manager = [AFHTTPSessionManager manager]; 7 } 8 return _manager; 9 }
返回数据,plist文件
---------------------------------------------------
2:根据返回的数据和文档的要求创建模型,新建对应需要的模型属性
1 // 用户 -- 发帖者 2 /** 用户的名字 */ 3 @property (nonatomic, copy) NSString *name; 4 /** 用户的头像 */ 5 @property (nonatomic, copy) NSString *profile_image; 6 /** 帖子的文字内容 */ 7 @property (nonatomic, copy) NSString *text; 8 /** 帖子审核通过的时间 */ 9 @property (nonatomic, copy) NSString *created_at; 10 /** 顶数量 */ 11 @property (nonatomic, assign) NSInteger ding; 12 /** 踩数量 */ 13 @property (nonatomic, assign) NSInteger cai; 14 /** 转发\分享数量 */ 15 @property (nonatomic, assign) NSInteger repost; 16 /** 评论数量 */ 17 @property (nonatomic, assign) NSInteger comment; 18
---------------------------------------------------
3:创建数组,将返回的数据使用字典转模型转成数组保存到创建的数组中(导入MJextention)
1 @property (nonatomic, strong) NSMutableArray *components; 2 3 -(NSMutableArray *)components 4 { 5 if (_components == nil) { 6 _components = [NSMutableArray array]; 7 } 8 return _components; 9 }
再请求数据成功的block里面实现讲数据保存到数组
- self.components = [iCocosComponentsModel objectArrayWithKeyValuesArray:response[@"list"]];
---------------------------------------------------
4:在cell中显示数据(count/cell)
1 #pragma mark - Table view data source 2 3 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 4 return self.components.count; 5 } 6 7 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 8 { 9 10 static NSString *ID = @"iCocos"; 11 12 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; 13 if (cell == nil) { 14 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID]; 15 } 16 17 iCocosComponentsModel *model = self.components[indexPath.row]; 18 19 cell.textLabel.text = model.name; 20 21 return cell; 22 23 }
显示界面
---------------------------------------------------
5:添加系统自带的刷新控件
添加点击实现刷新数据
实现方法loadNewTopics并且在里面实现数据请求加载最新数据,然后再对应的时刻结束刷新endRefreshing
- 注:刷新的时候,离开界面在点击回来会卡住
---------------------------------------------------
6:添加MJRefresh属性控件
使用:
下啦:加载最新的数据ID越来越大
上啦:加载旧的数据ID越来越小
属性
实现刷新数据
加载更多:取消之前的数据,直接加载所有最新的
上啦加载更多
原理
- 原理1:
- 原理2(推荐):
实现界面:
常见使用方法:
常见属性
基本使用:
1 __weak __typeof(self) weakSelf = self; 2 3 /** 4 * 上啦 5 */ 6 self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{ 7 // 进入刷新状态后会自动调用这个block 8 // 隐藏时间 9 [weakSelf loadNewData]; 10 }]; 11 12 // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法) 13 self.tableView.header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)]; 14 // 马上进入刷新状态 15 [self.tableView.header beginRefreshing]; 16 17 18 19 /** 20 * 下啦 21 */ 22 self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ 23 // 进入刷新状态后会自动调用这个block 24 // 隐藏时间 25 [weakSelf loadMoreData]; 26 }]; 27 28 // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法) 29 self.tableView.footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)]; 30 31 // 马上进入刷新状态 32 [self.tableView.footer beginRefreshing]; 33 34 - (void)loadNewData 35 { 36 // 1.添加假数据 37 for (int i = 0; i<5; i++) { 38 // [self.data insertObject:MJRandomData atIndex:0]; 39 } 40 41 // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码) 42 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 43 // 刷新表格 44 [self.tableView reloadData]; 45 46 // 拿到当前的下拉刷新控件,结束刷新状态 47 [self.tableView.header endRefreshing]; 48 }); 49 } 50 51 #pragma mark 上拉加载更多数据 52 - (void)loadMoreData 53 { 54 // 1.添加假数据 55 for (int i = 0; i<5; i++) { 56 // [self.data addObject:MJRandomData]; 57 } 58 59 // 2.模拟2秒后刷新表格UI(真实开发中,可以移除这段gcd代码) 60 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 61 // 刷新表格 62 [self.tableView reloadData]; 63 64 // 拿到当前的上拉刷新控件,结束刷新状态 65 [self.tableView.footer endRefreshing]; 66 }); 67 } 68
---------------------------------------------------
7:刷新数据bug
上啦和下啦同时进行
如果上啦先回来就回出现数据丢失
解决bug:控制器只人最后那个请求操作,其他的废弃
---------------------------------------------------
8:自定义Cell,使用Xib,实现Cell中对应的方法
注:因为我们使用的MVC模式作为项目的主设置模式,所以后面遇到数据处理,和数据显示第一想到的都应该是MVC
---------------------------------------------------
9:自动计算高度,适合于不同高度的Cell,
如果cell的高度不确定或者基本不一样,我们使用动态方式实现
拖线:
---------------------------------------------------
10:底部工具条的基本实现(数字拼接)
方法抽取
1 /** 2 * 设置工具条按钮的文字 3 */ 4 - (void)setupButtonTitle:(UIButton *)button number:(NSInteger)number placeholder:(NSString *)placeholder 5 { 6 if (number >= 10000) { 7 [button setTitle:[NSString stringWithFormat:@"%.1f万", number / 10000.0] forState:UIControlStateNormal]; 8 } else if (number > 0) { 9 [button setTitle:[NSString stringWithFormat:@"%zd", number] forState:UIControlStateNormal]; 10 } else { 11 [button setTitle:placeholder forState:UIControlStateNormal]; 12 } 13 }
实现设置
1 // 设置底部工具条的数字 2 [self setupButtonTitle:self.dingButton number:topic.ding placeholder:@"顶"]; 3 [self setupButtonTitle:self.caiButton number:topic.cai placeholder:@"踩"]; 4 [self setupButtonTitle:self.repostButton number:topic.repost placeholder:@"分享"]; 5 [self setupButtonTitle:self.commentButton number:topic.comment placeholder:@"评论"];
---------------------------------------------------
11:提示框的三种方式
1:UIAlertView
2:UIActionSheet
3:UIAlertController
*UIAlertView
*UIActionSheet
---------------------------------------------------
12:UITableView内部(Cell)调整
---------------------------------------------------
13:日期处理
基本格式:
获取时间间隔
日历类:(必须先转换成NSNdate)
服务器返回时间与处理:
基本使用
获取日期元素
1 // 获取当前秒:基本手表时针旋转动画 2 // 日历 3 NSCalendar *calendar = [NSCalendar currentCalendar]; 4 5 // 日期组件:秒,分,时,日,月,年 6 // NSCalendarUnit:表示日期组件由哪些单元组成 7 NSDateComponents *dateCmp = [calendar components:NSCalendarUnitSecond | NSCalendarUnitMinute | NSCalendarUnitHour fromDate:[NSDate date]]; 8 9 CGFloat sec = dateCmp.second; 10 11 // 获取分 12 CGFloat minute = dateCmp.minute; 13 14 // 获取小时 15 CGFloat hour = dateCmp.hour; 16 17 NSLog(@"%f %f",minute,hour); 18 19 根据时间旋转 20 // 计算秒针转多少度 21 CGFloat secA = angle2radion(perSecA * sec); 22 23 // 计算分针转多少度‘ 24 CGFloat minA = angle2radion(perMinuteA * minute); 25 26 // 计算时针转多少度 27 CGFloat hourA = angle2radion(perHourA * hour + minute * perMinuteHourA); 28 29 // 秒针 30 _secLayer.transform = CATransform3DMakeRotation(secA, 0, 0, 1); 31 32 // 分针 33 _minuteLayer.transform = CATransform3DMakeRotation(minA, 0, 0, 1); 34 35 // 时针 36 _hourLayer.transform = CATransform3DMakeRotation(hourA, 0, 0, 1); 37 38 39