diff --git a/MJRefresh/UIScrollView+MJExtension.h b/MJRefresh/UIScrollView+MJExtension.h index dd70d088..06c6c840 100644 --- a/MJRefresh/UIScrollView+MJExtension.h +++ b/MJRefresh/UIScrollView+MJExtension.h @@ -22,4 +22,17 @@ @property (assign, nonatomic) CGFloat mj_contentW; @property (assign, nonatomic) CGFloat mj_contentH; + +/** Ma.).Mi ✎ + * 首页tabbar滚动隐藏新策略 + * @1. 根据滚动距离判断 + * @2. 根据滚动方向判断 + * ps: 希望能加入到扩展当中,不用再维护previousOffsetY临时变量。😊 + */ +typedef NS_ENUM(NSInteger, ScrollDirection) { + None = 0, Top, Left, Bottom, Right +}; +@property (nonatomic, assign, readonly) NSInteger mj_scrollDistance; +@property (nonatomic, assign, readonly) ScrollDirection mj_scrollDirection; + @end diff --git a/MJRefresh/UIScrollView+MJExtension.m b/MJRefresh/UIScrollView+MJExtension.m index b8158fe2..7976a5a5 100644 --- a/MJRefresh/UIScrollView+MJExtension.m +++ b/MJRefresh/UIScrollView+MJExtension.m @@ -152,5 +152,90 @@ - (CGFloat)mj_contentH { return self.contentSize.height; } + +/** Ma.).Mi ✎ + * 每次 scrollview 滑动的方向 + */ +- (ScrollDirection)mj_scrollDirection { + NSInteger distance = self.mj_scrollDistance; + /** Ma.).Mi ✎ + * 如果是 UITableView + */ + if ([self.delegate respondsToSelector:@selector(tableView:numberOfRowsInSection:)] || [self.delegate respondsToSelector:@selector(numberOfSectionsInTableView:)]) { + return distance > 0 ? Bottom : (distance != 0 ? Top : None); + } else { + if (self.mj_offsetX > self.mj_offsetY) { + return distance > 0 ? Right : (distance != 0 ? Left : None); + } else { + return distance > 0 ? Bottom : (distance != 0 ? Top : None); + } + } +} + +/** Ma.).Mi ✎ + * 每次 scrollview 滑动的距离 + */ +- (NSInteger)mj_scrollDistance { + if (self.mj_offsetY > 0) { + /** Ma.).Mi ✎ + * 如果是 UITableView + */ + if ([self.delegate respondsToSelector:@selector(tableView:numberOfRowsInSection:)] || [self.delegate respondsToSelector:@selector(numberOfSectionsInTableView:)]) { + return ABS(self.mj_offsetY) - ABS(self.mj_previousOffsetY) + self._setPreviousOffsetY; + } else { + if (self.mj_offsetX > self.mj_offsetY) { + return ABS(self.mj_offsetX) - ABS(self.mj_previousOffsetX) + self._setPreviousOffsetX; + } else { + return ABS(self.mj_offsetY) - ABS(self.mj_previousOffsetY) + self._setPreviousOffsetY; + } + } + } else if (self.mj_offsetY < 0) { + return self.mj_offsetY; + } else { + return 0; + } +} + +/** Ma.).Mi ✎ + * previous contentOffset.y + */ +- (CGFloat)mj_previousOffsetY { + id value = objc_getAssociatedObject(self, _cmd); + if (value) { + CGFloat value_float = ((NSNumber *)value).floatValue; + return value_float; + } else { + objc_setAssociatedObject(self, _cmd, [NSNumber numberWithFloat:self.mj_offsetY], OBJC_ASSOCIATION_RETAIN); + } + + return 0; +} + +/** Ma.).Mi ✎ + * previous contentOffset.x + */ +- (CGFloat)mj_previousOffsetX { + id value = objc_getAssociatedObject(self, _cmd); + if (value) { + CGFloat value_float = ((NSNumber *)value).floatValue; + return value_float; + } else { + objc_setAssociatedObject(self, _cmd, [NSNumber numberWithFloat:self.mj_offsetX], OBJC_ASSOCIATION_RETAIN); + } + + return 0; +} + +#pragma mark #Ma.).Mi# - private method +- (int)_setPreviousOffsetX { + objc_setAssociatedObject(self, @selector(mj_previousOffsetX), [NSNumber numberWithFloat:self.mj_offsetX], OBJC_ASSOCIATION_RETAIN); + return 0; +} + +- (int)_setPreviousOffsetY { + objc_setAssociatedObject(self, @selector(mj_previousOffsetY), [NSNumber numberWithFloat:self.mj_offsetY], OBJC_ASSOCIATION_RETAIN); + return 0; +} + @end #pragma clang diagnostic pop