IOS-通过自定义iCarousel来高仿土巴兔选择装修风格效果(中间选中项放大)

本文主要是介绍IOS-通过自定义iCarousel来高仿土巴兔选择装修风格效果(中间选中项放大),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是Android-通过自定义ViewPager来高仿土巴兔选择装修风格效果的姐妹篇,上篇通过自定义ViewPager来实现了选中的一项居中并放大的效果,这里通过iCarousel来实现这个效果,iCarousel是我最喜欢的一个IOS开源库之一,我几乎每个IOS项目都用到了它,真的是非常的赞。好了,废话不多说,马上进入主题,在开始之前,先看下我们高仿后的效果图:

tubatu-viewpager-fang-ios.gif

要实现这个效果,总体难度上要比Android上轻松不少,你不需要关心点击左右边缘切换到相应的Item,iCarousel都已经帮你实现了,而且iCarousel的每个View都是支持复用。

总体难点就一个地方,那就是自定义iCarousel,然后设置相应的缩放动画。

首先,我们需要把iCarousel的type值设置成iCarouselTypeCustom,看代码

-(iCarousel *)iCarousel{CGFloat height = ScreenWidth - 2 *PAGE_OFFSET;if (_iCarousel == nil) {_iCarousel = [[iCarousel alloc] initWithFrame:CGRectMake(0, (ScreenHeight-height)*0.5, ScreenWidth, height)];_iCarousel.delegate = self;_iCarousel.dataSource = self;_iCarousel.bounces = NO;_iCarousel.pagingEnabled = YES;_iCarousel.type = iCarouselTypeCustom;}return _iCarousel;
}

然后,我们设置iCarousel两个必须的代理方法viewForItemAtIndexnumberOfItemsInCarousel,看代码:

#pragma mark - iCarousel代理
-(UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view{if (view == nil) {CGFloat viewWidth = ScreenWidth - 2*PAGE_OFFSET;view = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, viewWidth, viewWidth)];}((UIImageView *)view).image = [UIImage imageNamed:[self.dataList objectAtIndex:index]];return view;
}-(NSInteger)numberOfItemsInCarousel:(iCarousel *)carousel{return self.dataList.count;
}

经过上面设置后,我们的iCarousel就加进来了,但是你会发现,加进来的iCarousel不能滑动了,这是什么鬼。。。。

这是为什么呢?这是因为我们有一个非常重要的方法没有实现,这个方法是:

-(CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform

这个方法就是整个iCarousel的核心所在,所有的动画效果都是这个方法来实现的

这里稍微讲解下iCarousel的原理:

  1. iCarousel不是基于UIScrollView实现的,而是直接继承UIView来实现

  2. iCarousel通过UIPanGestureRecognizer来计算和维护scrollOffset这个变量

  3. iCarousel本身并不会改变itemView的位置 而是靠修改itemView的layer.transform来实现位移和形变

为了实现我们想要中间放大的效果,就必须重写这个方法,看下我们的代码:

-(CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform{static CGFloat max_sacle = 1.0f;static CGFloat min_scale = 0.6f;if (offset <= 1 && offset >= -1) {float tempScale = offset < 0 ? 1+offset : 1-offset;float slope = (max_sacle - min_scale) / 1;CGFloat scale = min_scale + slope*tempScale;transform = CATransform3DScale(transform, scale, scale, 1);}else{transform = CATransform3DScale(transform, min_scale, min_scale, 1);}return CATransform3DTranslate(transform, offset * self.iCarousel.itemWidth * 1.4, 0.0, 0.0);
}

核心的算法和我们Android版本的是一样的,只不过这里加了这个形变,一个是Scale形变,一个是移动Translate形变。经过上面的代码就实现我们想要的结果了。

小结

总体实现来说,这个要比Android版本的要简单多了,核心代码就是改变layer.transform属性值。

这也说明iCarousel是多么优秀的一个开源库,说到这里,我个人是非常不喜欢重复造轮子的,能用最少的代码达到所需的要求是我一直以来的准则,而且很多经典的轮子库(比如iCarousel)也值得你去深入探索和学习,了解作者的想法和思路(站在巨人的肩膀)是一种非常不错的学习方法和开阔视野的途径

这篇关于IOS-通过自定义iCarousel来高仿土巴兔选择装修风格效果(中间选中项放大)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1034052

相关文章

SpringBoot自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

前端知识点之Javascript选择输入框confirm用法

《前端知识点之Javascript选择输入框confirm用法》:本文主要介绍JavaScript中的confirm方法的基本用法、功能特点、注意事项及常见用途,文中通过代码介绍的非常详细,对大家... 目录1. 基本用法2. 功能特点①阻塞行为:confirm 对话框会阻塞脚本的执行,直到用户作出选择。②

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主