1. 集成 自帶的 下拉屬性控件 ---------HWHomeViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// 集成刷新控件
[self setupRefresh];
}
/** 集成 下拉刷新 控件 */
- (void)setupRefresh
{
// 1.添加刷新控件
UIRefreshControl *control = [[UIRefreshControl alloc] init];
// 只有用戶通過手動下拉刷新,才會觸發UIControlEventValueChanged事件
[control addTarget:self action:@selector(refreshStateChange:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:control];
// 2.馬上進入刷新狀態(僅僅是顯示刷新狀態,並不會觸發UIControlEventValueChanged事件)
[control beginRefreshing];
// 3.馬上加載數據
[self refreshStateChange:control];
}
----------------------------------------------------------------------------------------------------------
/**
* UIRefreshControl進入刷新狀態:加載最新的數據
*/
- (void)refreshStateChange:(UIRefreshControl *)control
{
// 1.請求管理者
AFHTTPRequestOperationManager *mgr = [AFHTTPRequestOperationManager manager];
// 2.拼接請求參數
HWAccount *account = [HWAccountTool account];
NSMutableDictionary *params = [NSMutableDictionary dictionary];
params[@"access_token"] = account.access_token;
// 取出最前面的微博(最新的微博,ID最大的微博)
HWStatus *firstStatus = [self.statuses firstObject];
if (firstStatus) {
// 若指定此參數,則返回ID比since_id大的微博(即比since_id時間晚的微博),默認為0
params[@"since_id"] = firstStatus.idstr;
}
// 3.發送請求
[mgr GET:@"https://api.weibo.com/2/statuses/friends_timeline.json" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
// 將 "微博字典"數組 轉為 "微博模型"數組
NSArray *newStatuses = [HWStatus objectArrayWithKeyValuesArray:responseObject[@"statuses"]];
// 將最新的微博數據,添加到總數組的最前面
NSRange range = NSMakeRange(0, newStatuses.count);
NSIndexSet *set = [NSIndexSet indexSetWithIndexesInRange:range];
[self.statuses insertObjects:newStatuses atIndexes:set];
// 刷新表格
[self.tableView reloadData];
// 結束刷新刷新
[control endRefreshing];
// 顯示最新微博的數量
[self showNewStatusCount:newStatuses.count];
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
HWLog(@"請求失敗-%@", error);
// 結束刷新刷新
[control endRefreshing];
}];
}
/**
* 顯示最新微博的數量
*
* @param count 最新微博的數量
*/
- (void)showNewStatusCount:(int)count
{
// 1.創建label
UILabel *label = [[UILabel alloc] init];
// colorWithPatternImage: 這個方法用在平鋪的場合。
label.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"timeline_new_status_background"]];
label.width = [UIScreen mainScreen].bounds.size.width;
label.height = 35;
// 2.設置其他屬性
if (count == 0) {
label.text = @"沒有新的微博數據,稍後再試";
} else {
label.text = [NSString stringWithFormat:@"共有%d條新的微博數據", count];
}
label.textColor = [UIColor whiteColor];
label.textAlignment = NSTextAlignmentCenter;
label.font = [UIFont systemFontOfSize:16];
// 3.添加
label.y = 64 - label.height;
// 將label添加到導航控制器的view中,並且是蓋在導航欄下邊
[self.navigationController.view insertSubview:label belowSubview:self.navigationController.navigationBar];
// 4.動畫
// 先利用1s的時間,讓label往下移動一段距離
CGFloat duration = 1.0; // 動畫的時間
[UIView animateWithDuration:duration animations:^{
// label.y += label.height;
label.transform = CGAffineTransformMakeTranslation(0, label.height);
} completion:^(BOOL finished) {
// 延遲1s後,再利用1s的時間,讓label往上移動一段距離(回到一開始的狀態)
CGFloat delay = 1.0; // 延遲1s
// UIViewAnimationOptionCurveLinear:勻速
[UIView animateWithDuration:duration delay:delay options:UIViewAnimationOptionCurveLinear animations:^{
// label.y -= label.height;
label.transform = CGAffineTransformIdentity;
} completion:^(BOOL finished) {
[label removeFromSuperview];
}];
}];
// 如果某個動畫執行完畢後,又要回到動畫執行前的狀態,建議使用transform來做動畫
}