iOS仿高德首頁(yè)推拉效果實(shí)例代碼

上面是實(shí)現(xiàn)的效果,滑動(dòng)的視圖是新建的一個(gè)UIView子類
1、滑動(dòng)view的調(diào)用
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)不適配的問(wèn)題
2、為視圖添加滑動(dòng)手勢(shì)和tableview相關(guān)配置
UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
panGestureRecognizer.delegate = self;
[self addGestureRecognizer:panGestureRecognizer];
self.tableView.bounces = NO;
self.tableView.userInteractionEnabled = NO;
tableView必須加上上面這兩個(gè)屬性
userInteractionEnabled屬性是用來(lái)阻止當(dāng)視圖在底部時(shí)禁止tableview上的手勢(shì)的,不加這個(gè)屬性時(shí)會(huì)導(dǎo)致視圖在底部時(shí)會(huì)響應(yīng)tableview向上滾動(dòng)的事件,從而導(dǎo)致視圖無(wú)法整體向上滑動(dòng)。當(dāng)視圖滑到頂部時(shí)又需要把userInteractionEnabled設(shè)為YES,否則tableview無(wú)法向上滾動(dòng)。如果在底部時(shí)tableview并沒有展示出來(lái),展示的只是一些其他的控件就可以不需要設(shè)置這個(gè)屬性
bounces設(shè)為NO是為了阻止tableview滾動(dòng)到頂部時(shí)還能響應(yīng)自己的向下拉的事件,從而去響應(yīng)整個(gè)視圖的向下滑到手勢(shì)。
3、設(shè)置允許同時(shí)響應(yīng)多個(gè)手勢(shì)
- (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偏移量,記錄下來(lái)
-(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)過(guò)程中對(duì)速度和距離做了判斷,根據(jù)速度和距離將視圖滑動(dòng)到底部和頂部
- (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)視圖距離頂部的距離是否超過(guò)了屏幕的一半,如果超過(guò)了一半就往下滑到底部
// 如果小于一半就往上滑到頂部
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)事件?;巾敳繒r(shí)再將userInteractionEnabled設(shè)為YES
- (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全部注釋掉就可以了。
-(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仿高德首頁(yè)推拉效果的文章就介紹到這了,更多相關(guān)iOS仿高德首頁(yè)推拉內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
iOS開發(fā)實(shí)現(xiàn)搜索框(UISearchController)
這篇文章主要為大家詳細(xì)介紹了iOS開發(fā)實(shí)現(xiàn)搜索框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
iOS簡(jiǎn)單到無(wú)門檻調(diào)試WebView的步驟詳解
這篇文章主要給大家介紹了關(guān)于iOS調(diào)試WebView的相關(guān)資料,文中介紹的方法可以說(shuō)是非常簡(jiǎn)單,簡(jiǎn)單到無(wú)門檻,通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07

