上面是實(shí)現(xiàn)的效果,滑動(dòng)的視圖是新建的一個(gè)UIView子類
1、滑動(dòng)view的調(diào)用
1
2
3
|
SlideView * slideView = [[SlideView alloc] initWithFrame:CGRectMake( 0 , kScreenHeight- 140 , kScreenWidth, kScreenHeight- 100 )]; slideView.topH = 100 ; [self.view addSubview:slideView]; |
SlideView是新建的一個(gè)UIView子類
kScreenHeight屏幕高
kScreenWidth屏幕寬
topH是視圖滑動(dòng)到頂部時(shí)距離屏幕頂部的距離
注意點(diǎn):SlideView的高應(yīng)該是屏幕的高減去topH,否則視圖滑到頂部時(shí)高會(huì)有點(diǎn)不適配的問題
2、為視圖添加滑動(dòng)手勢(shì)和tableview相關(guān)配置
1
2
3
|
UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action: @selector (panAction:)]; panGestureRecognizer.delegate = self; [self addGestureRecognizer:panGestureRecognizer]; |
1
2
|
self.tableView.bounces = NO; self.tableView.userInteractionEnabled = NO; |
tableView必須加上上面這兩個(gè)屬性
userInteractionEnabled屬性是用來阻止當(dāng)視圖在底部時(shí)禁止tableview上的手勢(shì)的,不加這個(gè)屬性時(shí)會(huì)導(dǎo)致視圖在底部時(shí)會(huì)響應(yīng)tableview向上滾動(dòng)的事件,從而導(dǎo)致視圖無法整體向上滑動(dòng)。當(dāng)視圖滑到頂部時(shí)又需要把userInteractionEnabled設(shè)為YES,否則tableview無法向上滾動(dòng)。如果在底部時(shí)tableview并沒有展示出來,展示的只是一些其他的控件就可以不需要設(shè)置這個(gè)屬性
bounces設(shè)為NO是為了阻止tableview滾動(dòng)到頂部時(shí)還能響應(yīng)自己的向下拉的事件,從而去響應(yīng)整個(gè)視圖的向下滑到手勢(shì)。
3、設(shè)置允許同時(shí)響應(yīng)多個(gè)手勢(shì)
1
2
3
|
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } |
這個(gè)允許同時(shí)響應(yīng)多個(gè)手勢(shì)是必須的,否則視圖的手勢(shì)會(huì)被tableview的事件覆蓋掉。
4、滑動(dòng)相關(guān)邏輯處理
1、在scrollViewDidScroll中獲取tableview偏移量,記錄下來
1
2
3
4
5
|
-( void )scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat currentPostion = scrollView.contentOffset.y; self.stop_y = currentPostion; } |
2、滑動(dòng)手勢(shì)的處理
self.top是視圖的self.frame.origin.y,我這邊是寫在了分類中。
self.bottomH在視圖初始時(shí)將self.top賦值給了self.bottomH
在視圖滑動(dòng)過程中對(duì)速度和距離做了判斷,根據(jù)速度和距離將視圖滑動(dòng)到底部和頂部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
- ( void )panAction:(UIPanGestureRecognizer *)pan { // 獲取視圖偏移量 CGPoint point = [pan translationInView:self]; // stop_y是tableview的偏移量,當(dāng)tableview的偏移量大于0時(shí)則不去處理視圖滑動(dòng)的事件 if (self.stop_y> 0 ) { // 將視頻偏移量重置為0 [pan setTranslation:CGPointMake( 0 , 0 ) inView:self]; return ; } // self.top是視圖距離頂部的距離 self.top += point.y; if (self.top < self.topH) { self.top = self.topH; } // self.bottomH是視圖在底部時(shí)距離頂部的距離 if (self.top > self.bottomH) { self.top = self.bottomH; } // 在滑動(dòng)手勢(shì)結(jié)束時(shí)判斷滑動(dòng)視圖距離頂部的距離是否超過了屏幕的一半,如果超過了一半就往下滑到底部 // 如果小于一半就往上滑到頂部 if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) { // 滑動(dòng)速度 CGPoint velocity = [pan velocityInView:self]; CGFloat speed = 350 ; if (velocity.y < -speed) { [self goTop]; [pan setTranslation:CGPointMake( 0 , 0 ) inView:self]; return ; } else if (velocity.y > speed){ [self goBack]; [pan setTranslation:CGPointMake( 0 , 0 ) inView:self]; return ; } if (self.top > kScreenHeight/ 2 ) { [self goBack]; } else { [self goTop]; } } [pan setTranslation:CGPointMake( 0 , 0 ) inView:self]; } |
3、滑動(dòng)到底部和頂部的事件
滑到底部時(shí)需要userInteractionEnabled設(shè)為NO,取消掉tableview的響應(yīng)事件。滑到頂部時(shí)再將userInteractionEnabled設(shè)為YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
- ( void )goTop { [UIView animateWithDuration:0.5 animations:^{ self.top = self.topH; }completion:^( BOOL finished) { self.tableView.userInteractionEnabled = YES; }]; } - ( void )goBack { [UIView animateWithDuration:0.5 animations:^{ self.top = self.bottomH; }completion:^( BOOL finished) { self.tableView.userInteractionEnabled = NO; }]; } |
4、注意點(diǎn)
因?yàn)樵诘撞繒r(shí)給tableview的serInteractionEnabled屬性設(shè)置了NO,這將導(dǎo)致tableview上的所有事件都被取消了,包括cell的選中。如果想保留這個(gè)屬性,則可以在scrollViewDidScroll中增加[scrollView setContentOffset:CGPointMake(0, 0)]
同時(shí)將代碼中的serInteractionEnabled全部注釋掉就可以了。
1
2
3
4
5
6
7
8
9
|
-( void )scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat currentPostion = scrollView.contentOffset.y; self.stop_y = currentPostion; if (self.top>self.topH) { [scrollView setContentOffset:CGPointMake( 0 , 0 )]; } } |
至此整個(gè)滑動(dòng)效果就實(shí)現(xiàn)了,有興趣的小伙伴可以下載demo看看
總結(jié)
到此這篇關(guān)于iOS仿高德首頁推拉效果的文章就介紹到這了,更多相關(guān)iOS仿高德首頁推拉內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.jianshu.com/p/5c0c1059923f