這次公司需求做完版本上線随闺,趁著間隙募胃,寫(xiě)一些在這次版本開(kāi)發(fā)中代碼上遇到的問(wèn)題記錄和整個(gè)開(kāi)發(fā)感受的一點(diǎn)想法祥诽。
關(guān)于開(kāi)發(fā)
1.
這里主要用了UIScrollView兩個(gè)代理:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
第一個(gè)可以得到當(dāng)前scrollview的contentoffset從而設(shè)置導(dǎo)航欄和頭部的alpha值來(lái)控制顯隱锥余,第二個(gè)是在用戶(hù)滑動(dòng)到中間時(shí)判斷位置上下自動(dòng)滑動(dòng)避免只滑到中部的情況饼煞,具體代碼:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
if (scrollView.contentOffset.y <= 0) {
scrollView.bounces = false;
} else if(!scrollView.bounces) {
scrollView.bounces = true;
}
CGFloat minAlphaOffset = 0;
CGFloat maxAlphaOffset = 138-64;
CGFloat offset = scrollView.contentOffset.y;
CGFloat alpha = (offset - minAlphaOffset) / (maxAlphaOffset - minAlphaOffset);
self.barView.alpha = alpha;
self.headView.alpha = 1-alpha;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
CGFloat offset = scrollView.contentOffset.y;
if (offset < 74 && offset > 0) {
if (offset < 37) {
[self.tableView setContentOffset:CGPointMake(0, 0) animated:true];
} else {
[self.tableView setContentOffset:CGPointMake(0, 74) animated:true];
}
}
}
2.tableView頁(yè)的刷新邏輯辫塌,目前我是設(shè)置了一個(gè)布爾類(lèi)型的標(biāo)記isFetch表示是否在網(wǎng)絡(luò)請(qǐng)求保證同一時(shí)間只有單一請(qǐng)求,在網(wǎng)絡(luò)請(qǐng)求的時(shí)候判斷并設(shè)成true,在請(qǐng)求失敗或請(qǐng)求成功并且reloaddata后設(shè)回為false派哲。
這里要注意因?yàn)閞eloaddata是異步的臼氨,所以在設(shè)置時(shí)需要放在主線程上:
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
//刷新完成,執(zhí)行后續(xù)代碼
self.isFetch = false;
});
3.對(duì)于頁(yè)面上的UI芭届,如果一個(gè)頁(yè)面只創(chuàng)建一次使用一個(gè)的話储矩,建議使用懶加載感耙,把關(guān)于這個(gè)控件的東西都放在加載里設(shè)置。比如我要?jiǎng)?chuàng)建一個(gè)tableView持隧,還要設(shè)置tableHeaderView并且headerView本身也需要多個(gè)控件即硼,那么我就會(huì)這樣寫(xiě):
- (UIView *)headerView
{
if(!_headerView) {
_headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, 194)];
_headerView.backgroundColor = [UIColor colorWithRed:0Xec/255.0 green:0Xec/255.0 blue:0Xec/255.0 alpha:1.0];
[_headerView addSubview:self.contentImageView];
[_headerView addSubview:self.moreButton];
[_headerView addSubview:self.sendBtton];
[_headerView addSubview:self.divideView];
[_headerView addSubview:self.moreFunctionView];
}
return _headerView;
}
- (UITableView *)tableView
{
if (!_tableView) {
_tableView = [[UITableView alloc] init];
_tableView.frame = CGRectMake(0, 0, kScreenWidth, kScreenHeight-64);
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = [UIColor colorWithRed:0Xf7/255.0 green:0Xf7/255.0 blue:0Xf7/255.0 alpha:1.0];
_tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_tableView.showsVerticalScrollIndicator = false;
[self.view addSubview:_tableView];
_tableView.tableHeaderView = self.headerView;
_tableView.tableFooterView = [UIView new];
MJRefreshNormalHeader *header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(pulldownFetch)];
header.lastUpdatedTimeLabel.hidden = true;
_tableView.mj_header = header;
_tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(fetchServiceNoticeList)];
}
return _tableView;
}
以此類(lèi)推,其他的UI也各自寫(xiě)好自己的懶加載方法屡拨。這樣的好處是只要設(shè)置好了就不用再使用時(shí)想是否已經(jīng)創(chuàng)建并且去在想修改某個(gè)控件時(shí)可以輕松定位只酥。
對(duì)于數(shù)據(jù)也是如此。
4.從沒(méi)有navagationbar頁(yè)面跳轉(zhuǎn)到有navigationbar頁(yè)面的時(shí)候把顯示navigationBar方法放push后面呀狼,如:
[self.navigationController pushViewController:vc animated:true];
self.navigationController.navigationBarHidden = false;
這樣在跳轉(zhuǎn)的時(shí)候頁(yè)面不會(huì)提前下移裂允。