中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用iOS實現仿高德首頁推拉效果

發布時間:2021-11-12 18:41:43 來源:億速云 閱讀:380 作者:小新 欄目:開發技術

這篇文章主要介紹了如何使用iOS實現仿高德首頁推拉效果,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

如何使用iOS實現仿高德首頁推拉效果

上面是實現的效果,滑動的視圖是新建的一個UIView子類

1、滑動view的調用

SlideView * slideView = [[SlideView alloc] initWithFrame:CGRectMake(0, kScreenHeight-140, kScreenWidth, kScreenHeight-100)];
    slideView.topH = 100;
    [self.view addSubview:slideView];

SlideView是新建的一個UIView子類

kScreenHeight屏幕高

kScreenWidth屏幕寬

topH是視圖滑動到頂部時距離屏幕頂部的距離

注意點:SlideView的高應該是屏幕的高減去topH,否則視圖滑到頂部時高會有點不適配的問題

2、為視圖添加滑動手勢和tableview相關配置

UIPanGestureRecognizer * panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)];
    panGestureRecognizer.delegate = self;
    [self addGestureRecognizer:panGestureRecognizer];
self.tableView.bounces = NO;
    self.tableView.userInteractionEnabled = NO;

tableView必須加上上面這兩個屬性

userInteractionEnabled屬性是用來阻止當視圖在底部時禁止tableview上的手勢的,不加這個屬性時會導致視圖在底部時會響應tableview向上滾動的事件,從而導致視圖無法整體向上滑動。當視圖滑到頂部時又需要把userInteractionEnabled設為YES,否則tableview無法向上滾動。如果在底部時tableview并沒有展示出來,展示的只是一些其他的控件就可以不需要設置這個屬性
bounces設為NO是為了阻止tableview滾動到頂部時還能響應自己的向下拉的事件,從而去響應整個視圖的向下滑到手勢。

3、設置允許同時響應多個手勢

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

這個允許同時響應多個手勢是必須的,否則視圖的手勢會被tableview的事件覆蓋掉。

4、滑動相關邏輯處理

1、在scrollViewDidScroll中獲取tableview偏移量,記錄下來

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat currentPostion = scrollView.contentOffset.y;
    self.stop_y = currentPostion;
}

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實現仿高德首頁推拉效果”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

三河市| 镇宁| 韶山市| 沅陵县| 醴陵市| 海安县| 北辰区| 儋州市| 广丰县| 定南县| 中西区| 江永县| 进贤县| 白河县| 宁强县| 岚皋县| 灵台县| 郁南县| 正阳县| 万年县| 阳泉市| 称多县| 阆中市| 黄石市| 根河市| 天全县| 南昌县| 时尚| 孟津县| 北宁市| 社会| 石城县| 合水县| 克山县| 琼海市| 昭通市| 岫岩| 句容市| 阳西县| 军事| 精河县|