一直以來,蘋果的懸停效果,沒有太多的邏輯,所以直接使用UITableview的組頭懸停即可
但是最近的懸停效果比較繁瑣,如果繼續采用這方式,加上刷新的邏輯之后,或者有二級懸停之后,就不再好使了!
所以只能自己寫這種效果了
遇到的坑,一開始以為只要判斷懸停的位置,然后對兩個控件進行 滾動屬性的切換即可,但是發現有問題,到了臨界點,有一下卡頓,滾動停止,父視圖或者子視圖,並不能完美的跟上滾動!所以這種方案就夭折了!
新方案:依然采用監測臨界點的方法,但是這次通過設置兩個視圖的contenoffset屬性,其實兩個都在滾動,只是有一個一直在同一位置,視覺上就是一個在滾,一個等待了,到了臨界點,滾動狀態切換為相反,這樣就實現了!
同時還有一個關鍵點就是要設置一下滾動視圖的屬性!下邊直接上代碼!
#import <UIKit/UIKit.h> @interface CourseTableView : UITableView<UIGestureRecognizerDelegate> @end
#import "CourseTableView.h" @implementation CourseTableView /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{ return YES; } @end
//該方法返回YES時,意味着所有相同類型的手勢都會得到處理。
下面是簡單的臨界點判斷邏輯
//父tableview @property(nonatomic,assign)BOOL canScroll; //子tableview @property (nonatomic, assign) BOOL sonCanScroll;
#pragma mark UIScrollView - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat bottom = [_tableView rectForSection:0].size.height+MainScreenWidth*140/375.0; if (scrollView == _tableView) {//父視圖 CGFloat scrollViewY = _tableView.contentOffset.y; if (scrollViewY>=bottom) {//當subcell還沒有滾動到 _tableView.contentOffset = CGPointMake(0, bottom); if (self.canScroll) { self.canScroll = NO; self.sonCanScroll = YES; NSLog(@"父視圖懸停---111"); } }else{ if (!self.canScroll) {//子cell沒到頂 if (_courseTableview.contentOffset.y == 0) { self.canScroll = YES; self.sonCanScroll = NO; NSLog(@"父視圖動---2222"); }else{ _tableView.contentOffset = CGPointMake(0, bottom); NSLog(@"父視圖懸停---2222"); } } } if (_tableView.contentOffset.y == bottom &&_courseTableview.contentOffset.y == 0) { self.canScroll = YES; } } // NSLog(@"%lf",scrollView.contentOffset.y); if (scrollView == _courseTableview) {//子視圖 CGFloat scrollViewY = _courseTableview.contentOffset.y; if (!self.sonCanScroll&&self.canScroll) { _courseTableview.contentOffset = CGPointZero; NSLog(@"子視圖懸停---111"); } if (scrollViewY <= 0) { self.sonCanScroll = NO; _courseTableview.contentOffset = CGPointZero; self.canScroll = YES; NSLog(@"子視圖懸停---2222"); } if (_tableView.contentOffset.y == bottom &&_courseTableview.contentOffset.y == 0) { self.canScroll = YES; } } }
byzqk