// 根据状态做事情
if (state == MJRefreshStateIdle) {
if (oldState != MJRefreshStateRefreshing) return;
// 保存刷新时间
[[NSUserDefaults standardUserDefaults] setObject:[NSDate date] forKey:self.lastUpdatedTimeKey];
[[NSUserDefaults standardUserDefaults] synchronize];
// 恢复inset和offset
[UIView animateWithDuration:MJRefreshSlowAnimationDuration animations:^{
self.scrollView.mj_insetT += self.insetTDelta;
// 自动调整透明度
if (self.isAutomaticallyChangeAlpha) self.alpha = 0.0;
} completion:^(BOOL finished) {
self.pullingPercent = 0.0;
}];
}
不使用动画又分为两种情况:代码如下 第一种:
// 增加滚动区域
CGFloat top = self.scrollViewOriginalInset.top + self.zy_h;
NSLog(@"scrollViewOriginalInset %f", self.scrollViewOriginalInset.top);
NSLog(@"self.zy_h %f", self.zy_h);
NSLog(@"top %f", top);
// CGPoint offset = self.scrollView.contentOffset;
UIEdgeInsets inset = self.scrollView.contentInset;
inset.top = top;
self.scrollView.contentInset = inset;
// self.scrollView.contentInset {154, 0, 0, 0}
NSLog(@"self.scrollView.contentInset %@", NSStringFromUIEdgeInsets(self.scrollView.contentInset));
CGPoint offset = self.scrollView.contentOffset;
offset.y = - top;
NSLog(@"offset %f", offset.y);
self.scrollView.contentOffset = offset;
// self.scrollView.contentOffset {0, -257.66666666666669}
NSLog(@"self.scrollView.contentOffset %@", NSStringFromCGPoint(self.scrollView.contentOffset));
这种可以看到 效果很不好 UIScrollView先弹回最初状态然后再回到contentOffset设置的值设置的状态,这样的效果根本不能是下拉刷新效果,用户会感觉跳来跳去,这个方式直接放弃,之所以说有这个方式,是让读者明白 这样做不可以,当然mjrefresh是这样做的,但是他用了动画屏蔽了UIScrollView的回弹过程。
另一种正确的做法为:
// 增加滚动区域
CGFloat top = self.scrollViewOriginalInset.top + self.zy_h;
NSLog(@"scrollViewOriginalInset %f", self.scrollViewOriginalInset.top);
NSLog(@"self.zy_h %f", self.zy_h);
NSLog(@"top %f", top);
CGPoint offset = self.scrollView.contentOffset;
UIEdgeInsets inset = self.scrollView.contentInset;
inset.top = top;
self.scrollView.contentInset = inset;
// self.scrollView.contentInset {154, 0, 0, 0}
NSLog(@"self.scrollView.contentInset %@", NSStringFromUIEdgeInsets(self.scrollView.contentInset));
// CGPoint offset = self.scrollView.contentOffset;
// offset.y = - top;
//
// NSLog(@"offset %f", offset.y);
self.scrollView.contentOffset = offset;
// self.scrollView.contentOffset {0, -257.66666666666669}
NSLog(@"self.scrollView.contentOffset %@", NSStringFromCGPoint(self.scrollView.contentOffset));
这个做法自己感觉不错,使用了UIScrollView自己的回收动画,与下拉效果一气呵成 用户会感觉比较自然。当然mjrefresh里面使用的动画用户也不会太在意的。毕竟只是一个回弹的效果问题。这次标记一下。不明白的可以联系我。