由於公司寫一個新App的頁碼控件,可是發現原來的App頁碼控件代碼侵入比較大,這樣會影響業務代碼,而且修改比較大。因此決定從新寫一個。git
首先這個控件須要幾個能力,上下划動須要顯示數字、點擊以後置頂功能、切換顯示view。
因此須要有一個類來監聽UITableView上下划動事件,而後使用runtime來交換UIScrollView幾個delegate的方法,scrollViewDidEndDecelerating:、scrollViewDidEndDragging:willDecelerate:,而後再回調出去。
爲了使用方便,這個類我使用了UIView。一些須要依賴這些方法的子view須要實現對應的方法後添加到這個UIView當中。github
固然我但願可以讓其餘人更容易添加自定義的子view,因此我專門寫了一個CSFooterCircleSubviewProtocol,來讓子view有能力去監聽UITableView的上下滑動和中止滑動。bash
@protocol CSFooterCircleSubviewProtocol <NSObject>
typedef void(^CSCircleFunctionSubviewsAnimationCompletion)(void);
@required
/**
subview是否顯示高亮
@param isHighlighted
*/
- (void)setHighlighted:(BOOL)isHighlighted;
/**
父tableview控件向上滑動
TODO: 須要使用加上willtableViewScrollUp回調,由於有些時候是須要狀態的改變而不是持續的狀態回調
@param view CSFooterCircleFunctionView
@param index 滑動時候顯示的cell的index
@param total 滑動時候顯示的cell的總共的數量
*/
- (void)tableViewScrollUp:(UIView<CSFooterCircleViewProtocol> *)view index:(NSInteger)index;
/**
父tableview控件向下滑動
TODO: 須要使用加上willScrollDown回調,由於有些時候是須要狀態的改變而不是持續的狀態回調
@param view CSFooterCircleFunctionView
@param index 滑動時候顯示的cell的index
@param total 滑動時候顯示的cell的總共的數量
*/
- (void)tableViewScrollDown:(UIView<CSFooterCircleViewProtocol> *)view index:(NSInteger)index;
/**
父tableview控件中止滑動
TODO: 須要使用加上willtableViewScrollStop回調,由於有些時候是須要狀態的改變而不是持續的狀態回調
@param view CSFooterCircleFunctionView
*/
- (void)tableViewScrollStop:(UIView<CSFooterCircleViewProtocol> *)view;
@end
複製代碼
CSFotterCircleScrollToTopSubview<CSFooterCircleSubviewProtocol> *scrollToTopSubViews = [[CSFotterCircleScrollToTopSubview alloc] initWithFrame:CGRectMake(0, 0, 45, 45)];
[scrollToTopSubViews setHighlighted:NO];
CSFotterCircleShowSrcollIndexTypeSubview<CSFooterCircleSubviewProtocol> *srcollIndexTypeSubview = [[CSFotterCircleShowSrcollIndexTypeSubview alloc] initWithFrame:CGRectMake(0, 0, 45, 45)];
[srcollIndexTypeSubview setTotal:50];
[srcollIndexTypeSubview setHighlighted:NO];
NSArray *retArr = @[scrollToTopSubViews,srcollIndexTypeSubview];
return retArr;
複製代碼
- (CSFooterCircleFunctionView *)footerCircleView
{
if (!_footerCircleView)
{
_footerCircleView = [[CSFooterCircleFunctionView alloc] initWithSubViews:(NSArray <CSFooterCircleSubviewProtocol>*)[self setupSubViewsForFooterCircleFunctionView]];
_footerCircleView.weakTableView = self.tableView;
__weak __typeof(self)weakSelf = self;
_footerCircleView.actionCompletion = ^(NSString *viewName, UIView<CSFooterCircleSubviewProtocol> *subview) {
if ([viewName isEqualToString:@"CSFotterCircleScrollToTopSubview"])
{
__strong __typeof(weakSelf)strongSelf = weakSelf;
[strongSelf.tableView setContentOffset:CGPointMake(0, 0) animated:YES];
}
};
}
return _footerCircleView;
}
複製代碼
若是有什麼建議和優化地方能夠在下面評論說噢,多謝你們閱讀。優化