本文主要介绍如何利用iOS实现模仿高德主页的推拉效果,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解一下。
以上是实现效果,滑动视图是新创建的UIView子类。
1、滑动view的调用
slide view * slide view=[[slide view alloc]initwithframe : cgrectmake(0,ksscreenheight-140,kScreenWidth,ksscreenheight-100)];
slideView.topH=100
[self . viewpaddsubview : slideview];SlideView是UIView的一个新子类。
屏幕高度屏幕高度
Ksheenwidth屏幕宽度
topf是视图滑动到顶部时离屏幕顶部的距离。
注意:SlideView的高度应该是屏幕的高度减去topf,否则当视图滑动到顶部时,高度会有点不合适。
2、为视图添加滑动手势和tableview相关配置
UIPanGestureRecognizer * panGestureRecognizer=[[UIPanGestureRecognizer alloc]initwithtargets : self action : @ selector(panact :)];
pangesturerecognizer . delegate=self;
[self addgesturerecognizer : pangesturerecognizer];self . tableview . bounds=NO;
self . tableview . useinteractionenabled=NO;TableView必须添加上述两个属性。
userInteractionEnabled属性用于防止在视图位于底部时禁止tableview上的手势。如果未添加此属性,视图将响应tableview位于底部时向上滚动的事件,从而导致视图整体无法向上滑动。当视图滑动到顶部时,您需要将userInteractionEnabled设置为YES,否则表格视图无法向上滚动。如果tableview不显示在底部,则只显示一些其他控件,因此不需要设置此属性。
“反弹”被设置为“否”,以防止tableview滚动到顶部时响应其自身的向下事件,从而响应整个视图的向下滑动手势。
3、设置允许同时响应多个手势
-(BOOL)手势识别器:(UIGestureRecognizer*)手势识别器应该同时识别与手势识别器:(UIGestureRecognizer*)其他手势识别器{
返回是;
}这是允许同时响应多个手势所必需的,否则视图的手势将被tableview的事件覆盖。
00-1010 1.获取scrollViewDidScroll中的tableview偏移量并记录下来。
-(void)scrollviewdscroll :(UIScrollView *)scrollView
{
cgfloatictcurrentposition=scrollview . content offset . y;
self . stop _ y=current position;
}2.滑动手势的处理
Self.top是视图的self.frame.origin.y,写在我这边的分类里。
。
self.bottomH在视图初始时将self.top赋值给了self.bottomH
在视图滑动过程中对速度和距离做了判断,根据速度和距离将视图滑动到底部和顶部
- (void)panAction:(UIPanGestureRecognizer *)pan { // 获取视图偏移量 CGPoint point = [pan translationInView:self]; // stop_y是tableview的偏移量,当tableview的偏移量大于0时则不去处理视图滑动的事件 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是视图在底部时距离顶部的距离 if (self.top > self.bottomH) { self.top = self.bottomH; } // 在滑动手势结束时判断滑动视图距离顶部的距离是否超过了屏幕的一半,如果超过了一半就往下滑到底部 // 如果小于一半就往上滑到顶部 if (pan.state == UIGestureRecognizerStateEnded || pan.state == UIGestureRecognizerStateCancelled) { // 滑动速度 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、滑动到底部和顶部的事件
滑到底部时需要userInteractionEnabled设为NO,取消掉tableview的响应事件。滑到顶部时再将userInteractionEnabled设为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、注意点
因为在底部时给tableview的serInteractionEnabled属性设置了NO,这将导致tableview上的所有事件都被取消了,包括cell的选中。如果想保留这个属性,则可以在scrollViewDidScroll中增加[scrollView setContentOffset:CGPointMake(0, 0)]
同时将代码中的serInteractionEnabled全部注释掉就可以了。
-(void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat currentPostion = scrollView.contentOffset.y; self.stop_y = currentPostion; if (self.top>self.topH) { [scrollView setContentOffset:CGPointMake(0, 0)]; } }
感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用iOS实现仿高德首页推拉效果”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/86828.html