这次公司需求做完版本上线,趁着间隙,写一些在这次版本开发中代码上遇到的问题记录和整个开发感受的一点想法。
关于开发
1.
这里主要用了UIScrollView两个代理:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
第一个可以得到当前scrollview的contentoffset从而设置导航栏和头部的alpha值来控制显隐,第二个是在用户滑动到中间时判断位置上下自动滑动避免只滑到中部的情况,具体代码:
- (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页的刷新逻辑,目前我是设置了一个布尔类型的标记isFetch表示是否在网络请求保证同一时间只有单一请求,在网络请求的时候判断并设成true,在请求失败或请求成功并且reloaddata后设回为false。
这里要注意因为reloaddata是异步的,所以在设置时需要放在主线程上:
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
//刷新完成,执行后续代码
self.isFetch = false;
});
3.对于页面上的UI,如果一个页面只创建一次使用一个的话,建议使用懒加载,把关于这个控件的东西都放在加载里设置。比如我要创建一个tableView,还要设置tableHeaderView并且headerView本身也需要多个控件,那么我就会这样写:
- (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;
}
以此类推,其他的UI也各自写好自己的懒加载方法。这样的好处是只要设置好了就不用再使用时想是否已经创建并且去在想修改某个控件时可以轻松定位。
对于数据也是如此。
4.从没有navagationbar页面跳转到有navigationbar页面的时候把显示navigationBar方法放push后面,如:
[self.navigationController pushViewController:vc animated:true];
self.navigationController.navigationBarHidden = false;
这样在跳转的时候页面不会提前下移。