空闲时间,自己实现了一下刷新和加载更多的库。总结了一下他实现的原理,其实很简单。
首先,要明白scrollView的几个属性。
contentOffset 是CGPoint类型 内容偏移量,当前显示的内容的顶点相对此控件顶点的x、y距离,默认为CGPointZero
contentSize 是CGSize 类型 控件内容大小,不一定在显示区域,如果这个属性不设置,此控件无法滚动,默认为CGSizeZero
UIEdgeInsets 控件四周边距,类似于css中的margin,注意边距不作为其内容的一部分,默认为UIEdgeInsetsZero
明白了这几个属性 当然还有scrollview的delegate在这就不说了。下面来看加载更多的实现原理。
#pragma 滚动视图delegate
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//y轴的最大偏移量
CGFloat maxoffsety=self.tableview.contentSize.height-self.tableview.frame.size.height;
//获取底部加载更多视图的高度
CGFloat footerviewheight=CGRectGetHeight(self.footerview.frame);
//开始拖拽 y轴的偏移量是要大于maxoff的但又不能超出footerview+max的高度
if (self.tableview.contentOffset.y>maxoffsety&&self.tableview.contentOffset.y<maxoffsety+footerviewheight) {
//设置 footerstates的状态 FooterViewStatesDraging
}
//准备加载
elseif (self.tableview.contentOffset.y>=maxoffsety+footerviewheight&&self.footerview.footerstates!=FooterViewStatesDraging)
{
//设置 footerstates的状态
}
}
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
//松手加载更多
if (self.footerview.footerstates==FooterViewStatesReady) {
//显示出footerview
[self.tableviewsetContentInset:UIEdgeInsetsMake(0,0, CGRectGetHeight(self.footerview.frame),0)];
}
else
{
[self.tableviewsetContentInset:UIEdgeInsetsZero];
}
}
在滑动过程中,先去判断y是否超出了最大偏移两,接着滑动到超出做大偏移量与foterview高度之和时,这是设置准备加载中。didscrollview这个方法是你只要滑动他就执行 所以里面的判断也是在一直执行的。
当你滑动结束的时候,在根据状态去判断就OK了。
在这的foterview 其实是加载滚动视图的最底部的 是超出屏幕了 所以我们看不见 但他一直都在的 你可以吧视图可视化一下 。要想看见它 去设置滚动视图的ContentInset 这个就可以了
UITableView *newview=(UITableView *)newSuperview;
CGRect frame=CGRectMake(0, newview.contentSize.height,CGRectGetWidth(newview.bounds),40);
[self.stateslabelsetFrame:frame];
这就是加载更多的简单原理。至于导航条的渐变就更简单了
#pragma mark---通过判断tableview滑动的位移 设置导航栏的颜色
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
contentOffsetY = scrollView.contentOffset.y;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
UIColor *color=kNavigationBarBlueColor;
CGFloat offset=scrollView.contentOffset.y; //通过y轴的偏移量来计算百分比 实现它
if (offset<0) {
self.navview.backgroundColor=[colorcolorWithAlphaComponent:0];
}else {
CGFloat alpha=1-((128-offset)/128);
self.navview.backgroundColor=[colorcolorWithAlphaComponent:alpha];
}
}