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

相关文章

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

如何选择SDR无线图传方案

在开源软件定义无线电(SDR)领域,有几个项目提供了无线图传的解决方案。以下是一些开源SDR无线图传方案: 1. **OpenHD**:这是一个远程高清数字图像传输的开源解决方案,它使用SDR技术来实现高清视频的无线传输。OpenHD项目提供了一个完整的工具链,包括发射器和接收器的硬件设计以及相应的软件。 2. **USRP(Universal Software Radio Periphera

《数据结构(C语言版)第二版》第八章-排序(8.3-交换排序、8.4-选择排序)

8.3 交换排序 8.3.1 冒泡排序 【算法特点】 (1) 稳定排序。 (2) 可用于链式存储结构。 (3) 移动记录次数较多,算法平均时间性能比直接插入排序差。当初始记录无序,n较大时, 此算法不宜采用。 #include <stdio.h>#include <stdlib.h>#define MAXSIZE 26typedef int KeyType;typedef char In