如何使用iOS实现仿高德首页推拉效果

技术如何使用iOS实现仿高德首页推拉效果这篇文章主要介绍了如何使用iOS实现仿高德首页推拉效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。上面是实现的效

本文主要介绍如何利用iOS实现模仿高德主页的推拉效果,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解一下。

如何使用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

(0)

相关推荐

  • 如何进行redis内存信息解析

    技术如何进行redis内存信息解析如何进行redis内存信息解析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。used_memory:由 Redis 分配器

    攻略 2021年10月29日
  • Oracle如何向PostgresQL移植

    技术Oracle如何向PostgresQL移植这篇文章主要为大家展示了“Oracle如何向PostgresQL移植”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle如

    攻略 2021年11月26日
  • win10系统升级,电脑怎么升级系统win10

    技术win10系统升级,电脑怎么升级系统win10在电脑设置—检查更新里面升级。1win10系统升级、在Win10系统桌面,点击桌面左下角“开始菜单”按钮,打开开始菜单页面。2、在打开的开始菜单页面中,点击页面中的“设置

    生活 2021年10月24日
  • javascript中=、==、===是否有区别

    技术javascript中=、==、===是否有区别这篇文章主要为大家展示了“javascript中=、==、===是否有区别”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“j

    攻略 2021年11月14日
  • MAC和树莓派如何实现文件共享和TM备份

    技术MAC和树莓派如何实现文件共享和TM备份这篇文章给大家分享的是有关MAC和树莓派如何实现文件共享和TM备份的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。使用 netatalk 让 Linu

    攻略 2021年11月20日
  • bv电线规格,BV和BVR线的所有规格

    技术bv电线规格,BV和BVR线的所有规格1、BV、BVV、BVR电源线:简单嘀来说: vv在电线术语是指两层聚露乙烯意义bv电线规格; BV聚露乙烯绝缘铜芯线,独芯线; BVV,聚露乙烯护套铜芯线,两芯线; (图

    生活 2021年10月21日