個(gè)性化wordpress南京百度提升優(yōu)化
知乎日?qǐng)?bào)第一周總結(jié)
文章目錄
- 知乎日?qǐng)?bào)第一周總結(jié)
- 前言
- 網(wǎng)絡(luò)異步導(dǎo)致視圖無法加載
- 加載網(wǎng)絡(luò)上的圖片
- 實(shí)現(xiàn)一個(gè)上拉刷新的效果
- 左上角的時(shí)間
- 初步實(shí)現(xiàn)了點(diǎn)擊cell進(jìn)入網(wǎng)頁
- 小結(jié)
前言
筆者在本周算是正式開始寫項(xiàng)目了,本周主要是大致完成了主頁的內(nèi)容,大致完成了主頁面的ui以及實(shí)現(xiàn)了點(diǎn)擊進(jìn)入單個(gè)cell的效果,但還存在一些小問題,之后找到解決方法會(huì)補(bǔ)充上去。
網(wǎng)絡(luò)異步導(dǎo)致視圖無法加載
因?yàn)榫W(wǎng)絡(luò)申請(qǐng)的異步經(jīng)常會(huì)導(dǎo)致我們的視圖無法實(shí)現(xiàn)正常的加載,會(huì)導(dǎo)致我們的視圖已經(jīng)加載好了但是上面沒有任何內(nèi)容。后面筆者查閱了一下資料后知道了應(yīng)該在我們的block回調(diào)函數(shù)里面加入dispatch_async(dispatch_get_main_queue(), <#^(void)block#>)
,這個(gè)函數(shù)的含義是一個(gè)異步執(zhí)行的GCD,他可以保證我們?cè)谄渌€程的任務(wù)完成后回到主線程中執(zhí)行相關(guān)函數(shù),在iOS開發(fā)中,布局UI的工作永遠(yuǎn)都是由主線程去完成的,所以我們必須要在主線程中執(zhí)行布局ui的相關(guān)函數(shù),這里自然也包括[self.iView.tableView reloadData]
下面筆者申請(qǐng)網(wǎng)絡(luò)請(qǐng)求后重新加載數(shù)據(jù)的部分代碼:
[[Manger sharedManger] urlDataLoad:^(MainPageModel * _Nonnull model) {self.iModel = [NSMutableArray arrayWithObject:model];dispatch_async(dispatch_get_main_queue(), ^{[self.iView.tableView reloadData];[self.iView.headActivity stopAnimating];});}];
加載網(wǎng)絡(luò)上的圖片
這里筆者采用了一個(gè)第三方庫(kù)SDWebImage
這個(gè)庫(kù)來申請(qǐng)我們從網(wǎng)絡(luò)上獲取的圖片,具體的使用同樣是通過一個(gè)cocopods庫(kù)來進(jìn)行一個(gè)導(dǎo)入就可以實(shí)現(xiàn)一個(gè)加載網(wǎng)絡(luò)上的圖片。筆者這里就簡(jiǎn)單介紹一下如何實(shí)現(xiàn)一個(gè)加載網(wǎng)絡(luò)圖片:
TopContentView* iView = [[TopContentView alloc] initWithFrame:CGRectMake(i * WIDTH, 0, WIDTH, WIDTH - 20)];
[iView.imageView sd_setImageWithURL:[NSURL URLWithString:topModel.image]];
實(shí)現(xiàn)一個(gè)上拉刷新的效果
實(shí)現(xiàn)的效果圖:
我們需要實(shí)現(xiàn)一個(gè)一個(gè)上拉刷新的一個(gè)效果,同時(shí)也需要一個(gè)加載的顯示,筆者這里沒有采用第三方庫(kù)來實(shí)現(xiàn),而是采用了UIScrollView的協(xié)議函數(shù)以及UIActivityIndicatorView這兩個(gè)東西來實(shí)現(xiàn),筆者這里采用的協(xié)議函數(shù)是- (void)scrollViewDidScroll:(UIScrollView *)scrollView
這個(gè)函數(shù)來實(shí)時(shí)監(jiān)控他的一個(gè)滑動(dòng),在他劃到最底端的時(shí)候開始進(jìn)行一個(gè)網(wǎng)絡(luò)請(qǐng)求申請(qǐng)一個(gè)新的數(shù)據(jù):
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {if (scrollView.tag == 100) {CGFloat x = scrollView.contentOffset.x;//CGFloat y = scrollView.contentOffset.y;CGFloat contentWidth = scrollView.contentSize.width;if (x >= contentWidth - WIDTH) {[scrollView setContentOffset:CGPointMake(WIDTH, 0) animated:NO];NSLog(@"1");} else if (x <= 0) {[scrollView setContentOffset:CGPointMake(contentWidth - 2 * WIDTH, 0) animated:NO];NSLog(@"2");} else {self.iView.page.currentPage = x / WIDTH - 1;}} else if (scrollView.tag == 101 && !self.loading) {CGFloat y = scrollView.contentOffset.y;CGFloat contentHeight = scrollView.contentSize.height;CGFloat height = scrollView.bounds.size.height;NSLog(@"%lf ? %lf", height, contentHeight);NSLog(@"%lf", y);if (y + height >= contentHeight + 10) { // 滑到接近底部的位置NSLog(@"%lf", y);[self loadData];} else if (y < -100) {[self download];}}
}
-(void)loadData {if (self.loading) {return;}self.loading = YES;NSInteger num = [self.dateModel.headString intValue];NSString* str = [NSString stringWithFormat:@"%ld", num - self.iModel.count + 1];NSLog(@"%@", str);self.iView.tableView.tableFooterView = self.iView.footerView;[self.iView.activity startAnimating];//[self.iView.activity startAnimating];[[Manger sharedManger] newDateLoad:^(MainPageModel * _Nonnull model) {[self.iModel addObject:model];NSLog(@"%ld", self.iModel.count);dispatch_async(dispatch_get_main_queue(), ^{[self.iView.tableView reloadData];[self.iView.activity stopAnimating];self.iView.tableView.tableFooterView = nil;self.loading = NO;});} andNsstring:str];
}
這里給這個(gè)視圖控制器設(shè)置了一個(gè)bool型的變量,如果這個(gè)變量的為YES的時(shí)候就說明他正在加載,就會(huì)直接退出防止他進(jìn)入網(wǎng)絡(luò)申請(qǐng),從而導(dǎo)致多次申請(qǐng)網(wǎng)絡(luò)請(qǐng)求,從而導(dǎo)致了加載的問題。
還有下面的加載圖案是筆者使用了一個(gè)UIActivityIndicatorView的控件,把這個(gè)空間添加到一個(gè)UIVIew上面,然后把那個(gè)UIView加到uitableView的footerView上就可以實(shí)現(xiàn)一個(gè)加載的效果。然后在網(wǎng)絡(luò)申請(qǐng)結(jié)束之后給這個(gè)tableView的footerView重新變成nil就可以實(shí)現(xiàn)了,這里筆者給出一張UITabeleView中一些屬性和控件的位置關(guān)系和圖片:
從這張圖片上我們就可以看出一條公式也就是contentOffset.y == content的頂部 和 frame.origin.y 的差值,所以只要兩者接近的時(shí)候就一意味著我們其實(shí)已經(jīng)滑動(dòng)的快接近底部了,所以就可以進(jìn)行一個(gè)網(wǎng)絡(luò)請(qǐng)求,但這里其實(shí)還有一個(gè)frame
和bounds
的區(qū)別,這里筆者之后會(huì)撰寫一篇博客來特別講述這部分內(nèi)容。
左上角的時(shí)間
左上角的時(shí)間筆者是采用了一個(gè)NSDate類來實(shí)現(xiàn),通過NSDate來獲取當(dāng)前的時(shí)間從而加載到坐上角的視圖中。
- (void)judgeDate {NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];[dateFormatter setDateFormat:@"MM-dd"];NSString* str0 = [dateFormatter stringFromDate:self.nowDate];NSString* str = [str0 substringWithRange: NSMakeRange(0, 2)];NSDictionary* monthDicty = @{@"01":@"正月",@"02":@"杏月",@"03":@"桃月",@"04":@"槐月",@"05":@"榴月",@"06":@"荷月",@"07":@"霜月",@"08":@"桂月",@"09":@"玄月",@"10":@"陽月",@"11":@"冬月",@"12":@"臘月"};
// NSDictionary* dataDicty = @{@"1":@"一",@"2":@"二",@"3":@"三",@"4":@"四",@"5":@"五",@"6":@"六",@"7":@"七",@"8":@"八",@"9":@"九"};NSString* str2 = [str0 substringWithRange: NSMakeRange(3, 1)];NSString* str3 = [str0 substringWithRange:NSMakeRange(4, 1)];self.monthString = [monthDicty[str] copy];self.dateString = [NSString stringWithFormat:@"%@%@", str2, str3];self.date = [NSString stringWithFormat:@"%@%@", str2, str3];self.month = [str copy];self.headString = [NSString stringWithFormat:@"2024%@%@%@", str, str2, str3];
}
- (NSMutableArray*)yesterDay:(NSInteger) section {NSInteger dateNum = [self.date intValue];NSInteger monthNum = [self.month intValue];NSString* dateStr = [NSString stringWithFormat:@"%ld", dateNum - section];NSString* monthStr = [NSString stringWithFormat:@"%ld", monthNum];return [NSMutableArray arrayWithArray:@[dateStr, monthStr]];
}
初步實(shí)現(xiàn)了點(diǎn)擊cell進(jìn)入網(wǎng)頁
這里只是初步實(shí)現(xiàn),采用了一個(gè)WKweb這個(gè)類來實(shí)現(xiàn),具體內(nèi)容會(huì)在下篇博客中講。
小結(jié)
筆者這里還有挺多問題未解決,如無限輪播圖下面的一個(gè)毛玻璃效果還未實(shí)現(xiàn),以及右上角的導(dǎo)航欄的頭像還沒布局,筆者準(zhǔn)備最后寫收藏中心的時(shí)候一并加上,這周學(xué)到很多知識(shí),也復(fù)習(xí)了很多內(nèi)容,發(fā)現(xiàn)自己對(duì)于各類知識(shí)的掌握仍有一些問題,iOS的學(xué)習(xí)任重而道遠(yuǎn),筆者會(huì)繼續(xù)努力學(xué)習(xí)相關(guān)內(nèi)容。