iOS?實(shí)現(xiàn)類似抖音滾動(dòng)效果
都是準(zhǔn)備好的內(nèi)容,需要的朋友可以參考下
效果圖

思路
整體上我們使用tableView實(shí)現(xiàn),為了預(yù)留內(nèi)容的緩沖,我們將tableView 的contentinset設(shè)置為上面一個(gè)屏幕的高度,下面一個(gè)屏幕的高度,左右為0,這樣保證我們滾動(dòng)過去的時(shí)候
都是準(zhǔn)備好的內(nèi)容
然后就是滑動(dòng)效果的實(shí)現(xiàn)了,主要就是我們?cè)趕crollViewWillEndDragging方法中獲取到停止拖動(dòng)(手指離開)時(shí)候的速度。 在scrollViewDidEndDragging 方法中
通過translationInView方法判斷當(dāng)前滑動(dòng)的方向,
然后剛才獲取到的速度就派上用場了,當(dāng)我們手指離開時(shí)候的速度大于0.4的時(shí)候,我們切換頁面的臨界偏移量就是8 ,否則臨界偏移量就是60, 同時(shí),通過
CGPoint translatedPoint = [scrollView.panGestureRecognizer translationInView:scrollView];判斷translatedPoint.y我們可以
判斷滾動(dòng)的方向,判斷出方向之后,
使用UIView animateWithDuration動(dòng)畫快速翻頁
代碼
//
// ViewController.m
// LBDouyinScroll
//
// Created by mac on 2024/6/26.
//
#import "ViewController.h"
#import "DouyinScrollTableViewCell.h"
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
@interface ViewController ()
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, assign) NSInteger currentIndex;
@property (nonatomic, assign) CGFloat velocity;
@property (nonatomic, strong) NSMutableArray *colorArray;
@end
@implementation ViewController
- (BOOL)prefersStatusBarHidden
{
return YES;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:self.tableView];
self.colorArray = [NSMutableArray array];
for (int i = 0; i < 10; i ++) {
int r = arc4random() % 255;
int g = arc4random() % 255;
int b = arc4random() % 255;
CGFloat rr = r / 255.0;
CGFloat rg = g / 255.0;
CGFloat rb = b / 255.0;
UIColor *color = [[UIColor alloc]initWithRed:rr green:rg blue:rb alpha:1];
[self.colorArray addObject:color];
}
[self.tableView reloadData];
// Do any additional setup after loading the view.
}
#pragma mark - UITableViewDelegate, UITableViewDataSource
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
DouyinScrollTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([DouyinScrollTableViewCell class])];
[cell updateWithColor:self.colorArray[indexPath.row]];
// cell.textLabel.text = [NSString stringWithFormat:@"%ld",indexPath.row];
// cell.backgroundColor = self.colorArray[indexPath.row];
// if (!cell.contentView.backgroundColor) {
// cell.contentView.backgroundColor = self.colorArray[indexPath.row];
// }
// return cell;
return cell;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 10;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return kScreenHeight;
}
#pragma mark - scrolllVIewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
}
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
self.velocity = velocity.y;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
dispatch_async(dispatch_get_main_queue(), ^{
CGPoint translatedPoint = [scrollView.panGestureRecognizer translationInView:scrollView];
//UITableView禁止響應(yīng)其他滑動(dòng)手勢(shì)
scrollView.panGestureRecognizer.enabled = NO;
CGFloat translateCheck = 60;
if (fabs(self.velocity) > 0.4) {
translateCheck = 8;
}
if(translatedPoint.y < -translateCheck && self.currentIndex < 10) {
self.currentIndex ++; //向下滑動(dòng)索引遞增
}
if(translatedPoint.y > translateCheck && self.currentIndex > 0) {
self.currentIndex --; //向上滑動(dòng)索引遞減
}
if (self.currentIndex == 10) {
} else {
[UIView animateWithDuration:0.15
delay:0.0
options:UIViewAnimationOptionCurveEaseOut animations:^{
//UITableView滑動(dòng)到指定cell
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.currentIndex inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
} completion:^(BOOL finished) {
//UITableView可以響應(yīng)其他滑動(dòng)手勢(shì)
scrollView.panGestureRecognizer.enabled = YES;
}];
}
});
}
#pragma - private
- (void)animationToIndex:(NSInteger)index
{
[UIView animateWithDuration:0.2 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.tableView.contentOffset = CGPointMake(0, kScreenHeight * index);
} completion:^(BOOL finished) {
}];
}
#pragma mark - lazy load
- (UITableView *)tableView
{
if (!_tableView) {
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, - kScreenHeight, CGRectGetWidth(self.view.bounds), kScreenHeight * 3) style:UITableViewStylePlain];
[_tableView registerClass:[DouyinScrollTableViewCell class] forCellReuseIdentifier:NSStringFromClass([DouyinScrollTableViewCell class])];
_tableView.rowHeight = kScreenHeight;
_tableView.contentInset = UIEdgeInsetsMake(kScreenHeight , 0, kScreenHeight, 0);
_tableView.estimatedRowHeight = kScreenHeight;
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = [UIColor redColor];
_tableView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
_tableView.separatorInset = UIEdgeInsetsZero;
_tableView.decelerationRate = UIScrollViewDecelerationRateFast;
}
return _tableView;
}
@end其中最關(guān)鍵的就是下面的
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
self.velocity = velocity.y;
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
dispatch_async(dispatch_get_main_queue(), ^{
CGPoint translatedPoint = [scrollView.panGestureRecognizer translationInView:scrollView];
//UITableView禁止響應(yīng)其他滑動(dòng)手勢(shì)
scrollView.panGestureRecognizer.enabled = NO;
CGFloat translateCheck = 60;
if (fabs(self.velocity) > 0.4) {
translateCheck = 8;
}
if(translatedPoint.y < -translateCheck && self.currentIndex < 10) {
self.currentIndex ++; //向下滑動(dòng)索引遞增
}
if(translatedPoint.y > translateCheck && self.currentIndex > 0) {
self.currentIndex --; //向上滑動(dòng)索引遞減
}
if (self.currentIndex == 10) {
} else {
[UIView animateWithDuration:0.15
delay:0.0
options:UIViewAnimationOptionCurveEaseOut animations:^{
//UITableView滑動(dòng)到指定cell
[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:self.currentIndex inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
} completion:^(BOOL finished) {
//UITableView可以響應(yīng)其他滑動(dòng)手勢(shì)
scrollView.panGestureRecognizer.enabled = YES;
}];
}
});
}demo: link
到此這篇關(guān)于iOS 實(shí)現(xiàn)類似抖音滾動(dòng)效果的文章就介紹到這了,更多相關(guān)iOS 抖音滾動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- iOS實(shí)現(xiàn)卡片式滾動(dòng)效果 iOS實(shí)現(xiàn)電影選片效果
- iOS ScrollView嵌套tableView聯(lián)動(dòng)滾動(dòng)的思路與最佳實(shí)踐
- iOS使用UICollectionView實(shí)現(xiàn)橫向滾動(dòng)照片效果
- iOS自定義時(shí)間滾動(dòng)選擇控件
- iOS自定義水平滾動(dòng)條、進(jìn)度條
- iOS自定義可展示、交互的scrollView滾動(dòng)條
- iOS仿網(wǎng)易新聞滾動(dòng)導(dǎo)航條效果
- iOS Swift UICollectionView橫向分頁滾動(dòng),cell左右排版問題詳解
相關(guān)文章
iOS列表上拉(平滑加載數(shù)據(jù))自動(dòng)加載數(shù)據(jù)的問題解決
這篇文章主要給大家介紹了關(guān)于iOS列表上拉(平滑加載數(shù)據(jù))自動(dòng)加載數(shù)據(jù)問題的相關(guān)資料,本文實(shí)現(xiàn)的效果很多app都用的這種效果,文中通過圖文以及實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-07-07
iOS實(shí)現(xiàn)秒殺活動(dòng)倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)秒殺活動(dòng)倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式
這篇文章主要介紹了IOS中(Xcode) DEBUG模式(RELEASE模式)控制NSLog輸出,NSLog輸出方式的相關(guān)資料,需要的朋友可以參考下2016-11-11
iOS開發(fā)中文件的上傳和下載功能的基本實(shí)現(xiàn)
這篇文章主要介紹了iOS開發(fā)中文件的上傳和下載功能的基本實(shí)現(xiàn),并且下載方面講到了大文件的多線程斷點(diǎn)下載,需要的朋友可以參考下2015-11-11
iOS使用UICollectionView實(shí)現(xiàn)列表頭部拉伸效果
這篇文章主要介紹了iOS使用UICollectionView實(shí)現(xiàn)列表頭部拉伸效果,OC和Swift兩個(gè)版本,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
ios的手勢(shì)操作之UIGestureRecognizer淺析(推薦)
本篇文章主要介紹了ios的手勢(shì)操作之UIGestureRecognizer淺析,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。2016-12-12

