首页 > 代码库 > iOS开发项目篇—31提示最新微博数

iOS开发项目篇—31提示最新微博数

iOS开发项目篇—31提示最新微博数

一、简单说明

1.导入图片素材

2.关于提示条的位置分析

原本的显示情况:

说明:滚动tableView对它没有任何的影响,可以知道提示条的父控件不应该是tableView

加入提示条之后的情况:

   

解决方案:

说明

(1)导航条是导航控制器的view子控件,可以把提示条添加到导航控制器的view上,当刷新的时候,有view调整提示条的位置。

(2)关于改变y的值以及transform的选择,如果是动画执行完成之后需要回复到以前的位置,那么建议使用transform

(3)让刷新控件自动进入到刷新状态,注意:通过代码并不会触发代理代理监听方法,只有手动拖动才会触发。

 

二、代码实现

YYHomeTableViewController.m文件

  1 //  2 //  YYHomeTableViewController.m  3 //  4   5 #import "YYHomeTableViewController.h"  6 #import "YYOneViewController.h"  7 #import "YYTitleButton.h"  8 #import "YYPopMenu.h"  9 #import "YYAccountModel.h" 10 #import "YYAccountTool.h" 11 #import "AFNetworking.h" 12 #import "UIImageView+WebCache.h" 13 #import "YYUserModel.h" 14 #import "YYStatusModel.h" 15 #import "MJExtension.h" 16  17 @interface YYHomeTableViewController ()<YYPopMenuDelegate> 18 @property(nonatomic,assign)BOOL down; 19 @property(nonatomic,strong)NSMutableArray *statuses; 20 @end 21  22 @implementation YYHomeTableViewController 23  24 #pragma mark- 懒加载 25 -(NSMutableArray *)statuses 26 { 27     if (_statuses==nil) { 28         _statuses=[NSMutableArray array]; 29     } 30     return _statuses; 31 } 32 - (void)viewDidLoad 33 { 34     [super viewDidLoad]; 35      36     //设置导航栏内容 37     [self setupNavBar]; 38      39     //集成刷新控件 40     [self setupRefresh]; 41 } 42  43 //集成刷新控件 44 -(void)setupRefresh 45 { 46     // 1.添加下拉刷新控件 47     UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; 48     [self.tableView addSubview:refreshControl]; 49      50     //2.监听状态 51     [refreshControl addTarget:self action:(@selector(refreshControlStateChange:)) forControlEvents:UIControlEventValueChanged]; 52      53     //3.让刷新控件自动进入到刷新状态 54     [refreshControl beginRefreshing]; 55      56     //4.手动调用方法,加载数据 57     //模拟网络延迟,延迟2.0秒 58     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 59         [self refreshControlStateChange:refreshControl]; 60     }); 61 } 62  63 /** 64  *  当下拉刷新控件进入刷新状态(转圈圈)的时候会自动调用 65  */ 66 -(void)refreshControlStateChange:(UIRefreshControl *)refreshControl 67 { 68     //1.获得请求管理者 69     AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager]; 70      71     //2.封装请求参数 72     NSMutableDictionary *params=[NSMutableDictionary dictionary]; 73     params[@"access_token"] =[YYAccountTool accountModel].access_token; 74     //取出当前微博模型中的第一条数据,获取第一条数据的id 75     YYStatusModel *firstStatus=[self.statuses firstObject]; 76     if (firstStatus) { 77         params[@"since_id"]=firstStatus.idstr; 78     } 79      80     //3.发送Get请求 81     [mgr GET:@"https://api.weibo.com/2/statuses/home_timeline.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary*accountDict) { 82         // 微博字典 -- 数组 83         NSArray *statusDictArray = accountDict[@"statuses"]; 84         //微博字典数组---》微博模型数组 85        NSArray *newStatuses =[YYStatusModel objectArrayWithKeyValuesArray:statusDictArray]; 86          87         //把新数据添加到旧数据的前面 88         NSRange range=NSMakeRange(0, newStatuses.count); 89         NSIndexSet *indexSet=[NSIndexSet indexSetWithIndexesInRange:range]; 90         [self.statuses insertObjects:newStatuses atIndexes:indexSet]; 91         YYLog(@"刷新了--%d条新数据",newStatuses.count); 92          93         //重新刷新表格 94         [self.tableView reloadData]; 95         //让刷新控件停止刷新(回复默认的状态) 96         [refreshControl endRefreshing]; 97        98         [self showNewStatusesCount:newStatuses.count]; 99         100     } failure:^(AFHTTPRequestOperation *operation, NSError *error) {101         YYLog(@"请求失败");102         //让刷新控件停止刷新(回复默认的状态)103         [refreshControl endRefreshing];104     }];105 106 }107 108 /**109  *  提示用户最新的微博数量110  *111  *  @param count 最新的微博数量112  */113 -(void)showNewStatusesCount:(int)count114 {115     //1.创建一个label116     UILabel *label=[[UILabel alloc]init];117     118     //2.设置label的文字119     if (count) {120         label.text=[NSString stringWithFormat:@"共有%d条新的微博数据",count];121     }else122     {123         label.text=@"没有最新的微博数据";124     }125     126     //3.设置label的背景和对其等属性127     label.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageWithName:@"timeline_new_status_background"]];128     label.textAlignment=UITextAlignmentCenter;129     label.textColor=[UIColor whiteColor];130     131     //4.设置label的frame132     label.x=0;133     label.width=self.view.width;134     label.height=35;135 //    label.y=64-label.height;136    label.y=self.navigationController.navigationBar.height+20-label.height;137     138     //5.把lable添加到导航控制器的View上139 //    [self.navigationController.view addSubview:label];140     //把label添加到导航控制器上,显示在导航栏的下面141     [self.navigationController.view insertSubview:label belowSubview:self.navigationController.navigationBar];142     143     //6.设置动画效果144     CGFloat duration=0.75;145     //设置提示条的透明度146     label.alpha=0.0;147    [UIView animateWithDuration:duration animations:^{148        //往下移动一个label的高度149        label.transform=CGAffineTransformMakeTranslation(0, label.height);150        label.alpha=1.0;151    } completion:^(BOOL finished) {//向下移动完毕152        153        //延迟delay秒的时间后,在执行动画154        CGFloat delay=0.5;155        156        [UIView animateKeyframesWithDuration:duration delay:delay options:UIViewAnimationOptionCurveEaseOut animations:^{157            158            //恢复到原来的位置159            label.transform=CGAffineTransformIdentity;160            label.alpha=0.0;161            162        } completion:^(BOOL finished) {163            164            //删除控件165            [label removeFromSuperview];166        }];167    }];168 }169 170 /**171  UIViewAnimationOptionCurveEaseInOut            = 0 << 16, // 开始:由慢到快,结束:由快到慢172  UIViewAnimationOptionCurveEaseIn               = 1 << 16, // 由慢到块173  UIViewAnimationOptionCurveEaseOut              = 2 << 16, // 由快到慢174  UIViewAnimationOptionCurveLinear               = 3 << 16, // 线性,匀速175  */176 177 /**设置导航栏内容*/178 -(void)setupNavBar179 {180     self.navigationItem.leftBarButtonItem=[UIBarButtonItem itemWithImageName:@"navigationbar_friendsearch" highImageName:@"navigationbar_friendsearch_highlighted" target:self action:@selector(friendsearch)];181     self.navigationItem.rightBarButtonItem=[UIBarButtonItem itemWithImageName:@"navigationbar_pop" highImageName:@"navigationbar_pop_highlighted" target:self action:@selector(pop)];182     183     //设置导航栏按钮184     YYTitleButton *titleButton=[[YYTitleButton alloc]init];185     //设置文字186     [titleButton setTitle:@"首页" forState:UIControlStateNormal];187     //设置图标188     [titleButton setImage:[UIImage imageWithName:@"navigationbar_arrow_down"] forState:UIControlStateNormal];189     //设置背景190     [titleButton setBackgroundImage:[UIImage resizedImage:@"navigationbar_filter_background_highlighted"] forState:UIControlStateHighlighted];191     192     //设置尺寸193     titleButton.width=100;194     titleButton.height=35;195     //监听按钮的点击事件196     [titleButton addTarget:self action:@selector(titleButtonClick:) forControlEvents:UIControlEventTouchUpInside];197     self.navigationItem.titleView=titleButton;198 }199 -(void)titleButtonClick:(UIButton *)titleButton200 {201 202         [titleButton setImage:[UIImage imageWithName:@"navigationbar_arrow_up"] forState:UIControlStateNormal];203         204         UITableView *tableView=[[UITableView alloc]init];205         [tableView setBackgroundColor:[UIColor yellowColor]];206         YYPopMenu *menu=[YYPopMenu popMenuWithContentView:tableView];207         [menu showInRect:CGRectMake(60, 55, 200, 200)];208         menu.dimBackground=YES;209 210     menu.arrowPosition=YYPopMenuArrowPositionRight;211         menu.delegate=self;212 }213 214 215 #pragma mark-YYPopMenuDelegate216 //弹出菜单217 -(void)popMenuDidDismissed:(YYPopMenu *)popMenu218 {219     YYTitleButton *titleButton=(YYTitleButton *)self.navigationItem.titleView;220     [titleButton setImage:[UIImage imageWithName:@"navigationbar_arrow_down"] forState:UIControlStateNormal];221 }222 -(void)pop223 {224     YYLog(@"---POP---");225 }226 -(void)friendsearch227 {228     //跳转到one这个子控制器界面229     YYOneViewController *one=[[YYOneViewController alloc]init];230     one.title=@"One";231     //拿到当前控制器232     [self.navigationController pushViewController:one animated:YES];233     234 }235 236 #pragma mark - Table view data source237 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section238 {239     return self.statuses.count;240 }241 242 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath243 {244     static NSString *ID = @"cell";245     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];246     if (!cell) {247         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];248     }249     250       //取出这行对应的微博字典数据,转换为数据模型251     YYStatusModel *status=self.statuses[indexPath.row];252     cell.textLabel.text=status.text;253     cell.detailTextLabel.text=status.user.name;254     NSString *imageUrlStr=status.user.profile_image_url;255     [cell.imageView setImageWithURL:[NSURL URLWithString:imageUrlStr] placeholderImage:[UIImage imageWithName:@"avatar_default_small"]];256     257     return cell;258 }259 260 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath261 {262     //点击cell的时候,跳到下一个界面263     UIViewController *newVc = [[UIViewController alloc] init];264     newVc.view.backgroundColor = [UIColor redColor];265     newVc.title = @"新控制器";266     [self.navigationController pushViewController:newVc animated:YES];267 }268 269 @end

实现效果: