原文链接:https://github.com/nicklockwood/iCarousel/blob/master/README.md#rotary
简介
iCarousel是一个类,旨在简化在iPhone,iPad和Mac OS上各种类型的轮播(页面,滚动视图)的实现。 iCarousel实现了许多常见的效果,例如圆柱形,扁平和“ CoverFlow”风格的旋转木马,并提供了挂钩来实现您自己的定制效果。 与许多其他“ CoverFlow”库不同,iCarousel可以使用任何类型的视图,而不仅仅是图像,因此它是在应用程序中以流畅而令人印象深刻的方式呈现分页数据的理想选择。 它还使通过最少的代码更改在不同的轮播效果之间切换变得非常容易。
支持 OS 和 SDK 版本
- Supported build target - iOS 10.0 / Mac OS 10.12 (Xcode 8.0, Apple LLVM compiler 8.0)
- Earliest supported deployment target - iOS 5.0 / Mac OS 10.7
- Earliest compatible deployment target - iOS 4.3 / Mac OS 10.6
注:“Supported”表示该库已经使用此版本进行了测试。 “Compatible”表示该库应在此OS版本上运行(即,它不依赖于任何不可用的SDK功能),但不再经过兼容性测试,可能需要进行调整或修正错误才能正常运行。
ARC兼容性
从1.8版开始,iCarousel需要ARC。 如果要在非ARC项目中使用iCarousel,只需将-fobjc-arc编译器标志添加到iCarousel.m类。 为此,请转到目标设置中的“构建阶段”选项卡,打开“编译源”组,双击列表中的iCarousel.m,然后在弹出窗口中键入-fobjc-arc。如果要将整个项目转换为ARC,请注释掉iCarousel.m中的#error行,然后在Xcode中运行“Edit > Refactor > Convert to Objective-C ARC...”
工具,并确保要转换的所有文件 使用ARC进行检查(包括iCarousel.m)。
线程安全
iCarousel
是UIView
的子类,和所有的UIKit
组件一样,它只能从主线程
访问。 您可能希望使用线程加载或更新轮播内容或项目,但始终确保一旦您的内容加载,您在更新轮播之前切换回主线程。
变色龙支持
iCarousel
现在与Chameleon iOS-to-Mac
转换库(https://github.com/BigZaphod/Chameleon)兼容。 要使用iCarousel
与Chameleon
,请将USING_CHAMELEON
添加到项目的预处理器宏中。 查看Chameleon Demo示例项目,了解如何使用Chameleon
将iOS iCarousel
应用程序移植到Mac OS - 该示例演示如何使用Chameleon
在Mac OS上运行No Nib iPhone
示例。 请注意,点击中心当前不起作用,滚动操作必须使用双指滚动手势进行,而不是单击拖动(这两个都是由于变色龙UIGestureRecognizer
实现的功能/限制)。
视图点击检测
在iOS上的iCarousel
中,有两种基本方法来检测视图上的点击。 第一种方法是简单地使用轮播didSelectItemAtIndex:delegate
方法,每次点击一个项目时都会触发。 如果您只需要对当前居中的item进行操作,可以将currentItemIndex
属性与此方法的index
参数进行比较。或者,如果您想要更多的控制,您可以提供UIButton
或UIControl
作为项目视图,并自己处理触摸交互。 有关如何完成此操作的示例,请参阅Buttons Demo
示例项目(在Mac OS上不起作用)。您还可以在项目视图中嵌套UIControls
,并且将按预期接收触摸(参见示例"Controls Demo"
)。如果您想检测其他类型的互动,例如滑动,双抽头或长按,最简单的方法是将UIGestureRecognizer
附加到您的项目视图或其子视图在传递给carousel
之前。
请注意,任何
tap
和gestures
在除中心item外的任何item将被忽略,除非你将centerItemWhenSelected
属性设置为NO
。
安装
要在应用程序中使用iCarousel类,只需将iCarousel类文件拖到您的项目中并添加QuartzCore框架。 您也可以按常规方式使用Cocoapods安装它。
属性和方法介绍
可选值(typedef NS_ENUM(NSInteger, iCarouselOption)
)
-
iCarouselOptionWrap
当carousel滚动到末尾时是否循环滚动的布尔值。 如果你想carousel在结束时循环滚动则返回YES
;如果你想其停止则返回NO
。 通常,circular类型的carousel默认情况下会自动循环滚动,而linear类型的carousel则不会。 返回类型是浮点值,除0.0
以外的任何值都将被视为YES。 -
iCarouselOptionShowBackfaces
对于某些carousel类型,例如iCarouselTypeCylinder
,可以看到某些视图的背面(iCarouselTypeInvertedCylinder
默认情况下隐藏背面)。 如果您希望隐藏朝后的视图,则可以为此选项返回NO
。 要覆盖iCarouselTypeInvertedCylinder
的默认背面隐藏,可以返回YES
。 此选项也可用于由自定义的carousel的transforms
而导致的显示视图背面的问题。 -
iCarouselOptionOffsetMultiplier
offset multiplier
是在用户拖动carousel时使用的。 它不影响编程式滚动或减速速度。 对于大多数carousel类型,默认值为1.0
,但是CoverFlow
样式的carousels默认值为2.0
(因为item间隔较小,因此必须进一步拖动以移动相同的距离)。 -
iCarouselOptionVisibleItems
Rotary
、Cylinder
和Wheel
改变时要显示的items的数量。 通常,这是根据视图尺寸和carousel中item的数量自动计算的,但是如果您想更精确地控制carousel的展示,则可以重新赋值。 此属性用于计算carousel的半径,而另一个选择是直接更改半径。 -
iCarouselOptionCount
在Rotary
、Cylinder
和Wheel
类型中显示的 item 的数量。通常,这是根据轮播中的视图大小和item 的数量自动计算的,但如果要更精确地控制 carousel 的显示,则可以重写此选项。该属性用于计算 carousel半径,因此另一个选项是直接操作半径。 -
iCarouselOptionArc
Rotary
、Cylinder
和Wheel
变换的弧度(以弧度为单位)。 通常,默认值为2 * M_PI
(一个完整的圆)。您也可以指定一个较小的值(例如,值M_PI
将创建一个半圆或圆柱)。此属性用于计算carousel半径和角度步长,另一个选择是直接更改这些值。 -
iCarouselOptionRadius
Rotary
、Cylinder
和Wheel
的半径以pixels
或points
为单位进行转换。 这个属性通常会进行计算以使可见的items适合指定的弧。 您可以修改这个值来增加或减少item的间距(和圆的半径)。 -
iCarouselOptionAngle
Rotary
、Cylinder
和Wheel
变换中每个项目之间的角度步长(以弧度为单位)。 在不更改半径的情况下修改该值会在carousel的末端造成间隙或导致item重叠。 -
iCarouselOptionTilt
应用于CoverFlow
、CoverFlow2
和TimeMachine
的carousel类型中非居中item的倾斜度。 此值应在0.0
到1.0
的范围内。 -
iCarouselOptionSpacing
item的间距。 该值乘以item的宽度(或高度,如果carousel是垂直的)以得到每个item之间的总间距,默认值为1.0
,表示视图之间没有间距(除非视图已经包含填充,就像在许多示例项目中的一样)。 -
iCarouselOptionFadeMin && iCarouselOptionFadeMax && iCarouselOptionFadeRange && iCarouselOptionFadeMinAlpha
这四个选项是基于其相对于当前居中项目的偏移量控制carousel的item的淡出方式。FadeMin
是项目视图开始淡入之前可以达到的最小负偏移量。FadeMax
是视图开始淡入之前可以达到的最大正偏移量。FadeRange
是淡出发生的距离,以item宽度的倍数度量(默认为1.0),FadeMinAlpha
是视图将淡入的最小alpha
值(默认为0.0
,表示完全透明)。
-
(iCarouselType) type
用来变换carousel展示样式,type 样式如下:
typedef NS_ENUM(NSInteger, iCarouselType){
iCarouselTypeLinear = 0, //线性的 ---> [平铺,不循环]
iCarouselTypeRotary, //可旋转的 ---> [外环,层叠]
iCarouselTypeInvertedRotary, //反向旋转式 ---> [内环,层叠]
iCarouselTypeCylinder, //圆柱式 ---> [外环,拼接]
iCarouselTypeInvertedCylinder, //反向圆柱式 ---> [内环,拼接]
iCarouselTypeWheel, //车轮式 ---> [车轮,扇形,影响比较大]
iCarouselTypeInvertedWheel, //反向车轮式 ---> [车轮,扇形,影响比较大]
iCarouselTypeCoverFlow, //封面流 ---> [翻页,不循环]
iCarouselTypeCoverFlow2, //封面流样式2 ---> [翻页2,不循环]
iCarouselTypeTimeMachine, //时光机 ---> [向上堆叠,不循环]
iCarouselTypeInvertedTimeMachine, //反向时光机 ---> [反堆叠,不循环]
iCarouselTypeCustom
};
(CGFloat) perspective
用来稍稍调整在多种3D carousel视图中视觉按照透视法缩短效果的,它应该是一个负数,值的范围在-0.01 ~ 0
(不包含 -0.01和 0),这个范围之外的值将会产生非常奇怪的结果。默认值是-1/500
或-0.005
。(CGFloat) decelerationRate
滑动时carousel减速的速率。 值越高减速越慢。 默认值为0.95
。 值的范围应在0.0~1.0
(0.0
表示carousel在released时立即停止;1.0
表示carousel持续滚动且不会减速,除非到达终点)。(CGFloat) scrollSpeed
用户滑动carousel时滑动速度乘数。默认值是1.0
。(CGFloat) bounceDistance
当非循环的carousel滑动超过末端时反弹的最大距离。 这是用itemWidth
的倍数来衡量的,因此值1.0
表示carousel会反弹一个完整的item宽度,值0.5
则表示反弹item宽度的一半,依此类推。 默认值为1.0
。(BOOL) scrollEnabled
使能或者禁止用户滚动carousel。如果这个值被设为NO
,carousel仍然可以以编程方式被滚动。(BOOL) pagingEnabled
启用和禁用分页。 启用分页后,carousel会在用户滚动时在每个item处停止,这与UIScrollView的pagesEnabled属性非常相似。-
(BOOL) vertical
此属性是切换carousel的在屏幕上的显示方向(水平显示或垂直显示)。 所有内置carousel类型都可以水平和垂直显示。 可以通过更改carousel的布局或屏幕上的滑动检测方向来切换carousel到垂直方向。注意:自定义的carousel变换不受这个属性影响,但切换手势的方向仍然会受影响。
(BOOL) wrapEnabled
如果启用了循环滚动则返回YES
;否则,则返回NO
。 该属性是只读的。 如果你想重新赋值,需要实现carousel:valueForOption:withDefault:
委托方法,并为iCarouselOptionWrap
返回一个值。-
(BOOL) bounces
设置carousel是否应弹跳到结尾并返回或突然停止。注意:在carousel样式设置为循环样式时或者
carouselShouldWrap
代理方法返回为YES
时,这个属性不起作用。 (CGFloat) scrollOffset
carousel的current scroll offset
,为itemWidth
的倍数。 该值四舍五入到最接近的整数,是currentItemIndex
值。 当carousel滑动时,您可以使用此值来定位其他屏幕元素。 如果希望以编程式将carousel滚动到特定偏移也可以设置该值。 如果您希望禁用内置手势处理并提供自己的实现方式也可是使用该值。(CGFloat) offsetMultiplier
用户拖动carousel时使用的偏移乘数。 它不影响程序滚动或减速速度。 对于大多数轮播类型,默认值为1.0
,但是CoverFlow样式轮播的默认值为2.0
(因为item间隔更近,因此必须进一步拖动以移动相同的距离)。 您不能直接设置此属性,但是可以通过实现carouselOffsetMultiplier:
这个代理方法对该值重新赋值。(CGSize) contentOffset
此属性用于调整carousel的item相对于carousel中心的偏移量。 默认为CGSizeZero
,表示carousel的items 居中。 更改此值将在不改变其角度的情况下移动carousel的items,即消失点随carousel的items一起移动,因此,如果您向下移动carousel的items,它不会让你看起来像是在俯视carousel。(CGSize) viewpointOffset
此属性用于相对于carousel items调整用户视点。 它与调整contentOffset
具有相反的效果,即如果您将视点向上移动,则carousel会向下移动。 与contentOffset
不同,移动视点还会更改相对于carousel items的透视消失点,因此,如果将视点向上移动,则看起来就像在下面看carousel。-
(NSInteger) numberOfItems
carousel中items的数量(只读)。 要进行设置,请实现dataSource中numberOfItemsInCarousel:
方法。注意:并非所有这些item都会在给定的时间点被加载或显示(carousel在滚动时根据需要加载项视图)。
(NSInteger) numberOfPlaceholders
在carousel中展示的占位视图的数量(只读)。可以通过实现numberOfPlaceholdersInCarousel:
方法改变numberOfPlaceholders
的值。(NSInteger) currentItemIndex
当前carousel中居中的item 的索引,设置这个属性相当于调用scrollToItemAtIndex:animated:
方法时将animated
参数设置为NO
。(UIView *) currentItemView
当前carousel中居中的item view。这个视图的索引与currentItemIndex
匹配。(NSArray *) indexesForVisibleItems
一个数组包含当前在轮播中加载和显示的所有项视图的索引,包括占位符视图。 该数组包含NSNumber对象,其整数值与视图的索引匹配。 项视图的索引从零开始,并匹配传递给dataSource的索引以加载视图,但任何可见占位符视图的索引将为负(小于零)或大于或等于numberOfItems。 此数组中占位符视图的索引不等于与dataSource一起使用的占位符视图索引。(NSInteger) numberOfVisibleItems
同时显示在屏幕上的carousel itemviews的最大数量(只读)。这个属性对执行最优化很重要,且是基于carousel的样式和视图的frame被自动计算的。如果你想重写这个默认值,实现carousel:valueForOption:withDefault:
这个代理方法且给iCarouselOptionVisibleItems
返回一个值。(NSInteger) visibleItemViews
一个存放当前carousel中展示的所有item views的数组(只读),它包括任何可见的占位视图。这个数组中视图的索引并不与item的索引匹配,但这些视图的顺序与visibleItemIndexes
数组属性中的顺序匹配,你可以通过从visibleItemIndexes
数组中去掉对应的对象来在这个数组中获取一个指定视图的索引(或者,你可以仅仅用indexOfItemView:
方法,这个会更简单)(CGFloat) itemWidth
carousel中展示的items
的宽度(只读)。这是自动从使用carousel:viewForItemAtIndex:reusingView:
数据源方法第一个传到carousel
中的视图中继承来的。你也可以使用carouselItemWidth:
代理方法重写这个值,这个方法会改变分配给carousel items的空间(但是不会对这些item views重写设置大小或规模)。-
(UIView *) contentView
包含carousel item views
的视图。你可以增加子视图如果你想用这些carousel items
散置这些视图。如果你想让一个视图出现在所有carouselitems
的前边或者后边,你应该直接添加它到iCarousel view
本身来替代。注意:在
contentView
中视图的顺序是受当app执行时的频率和未标注的变化决定的。任何添加到contentView
中的视图应该将他们的userInteractionEnabled
属性设置为NO
,来防止和iCarousel
的触摸时间处理放生冲突。 (CGFloat) toggle
这个属性用于iCarouselTypeCoverFlow2
的carousel
变换。它是被暴露的以便于你可以使用carousel:itemTransformForOffset:baseTransform:
代理方法实现自己的CoverFlow2样式变量。(BOOL) stopAtItemBoundary
默认情况下,carousel
被轻击时会停在一个准确的item
边界。如果你设置这个值为no
,他会自然停止,如果scrollToItemBoundary
被设置为yes
会滚回或者向前滚动到最接近的边界。(BOOL) scrollToItemBoundary
默认情况下,不管carousel
何时停止移动,他会自动滚动到最近的item
边界。如果你设置这个属性为no
,carousel
停止后将不会滚动且不管在哪儿他都会停下来,即使它不是正好对准当前的索引。有一个特例是如果打包效果被禁止且bounces
被设置为yes
,当它停下来时超出了carousel
的底部,carousel
会自动滚回第一个或者最后一个索引 。(BOOL) ignorePerpendicularSwipes
如果为yes
,carousel
将会忽略垂直于carousel
方向的切换手势。目前,一个水平的carousel
,垂直切换将不会被拦截。这就意味着你可以获得一个在carouselitem view
里垂直滚动的scrollView
,它依然会正确工作。默认值为yes
。(BOOL) centerItemWhenSelected
当设置为yes
时,点击任何在carousel
中的item
而不是那个匹配currentItemIndex
的视图,将会使平滑动画移动到居中位置。点击当前被选中的item
将没有效果。默认值是yes
。-
- (void) scrollByOffset:(CGFloat)offset duration:(NSTimeInterval)duration;
这个方法作用与scrollByNumberOfItems:
方法一样,但是允许你滚动到一个微小数量的items
。如果你想达到一个非常准确的动画效果时可能有用。注意:如果
scrollToItemBoundary
属性被设置为yes
,在你调用这个方法后carousel
无论如何会自动滚动到最近一个item
索引。 -
- (void) scrollToOffset:(CGFloat)offset duration:(NSTimeInterval)duration;
这个方法工作起来和scrollToItemAtIndex:
方法一样,但是允许你移动到一个微小的偏移。如果你想达到一个非常准确的动画效果时这个可能有用。注意:如果
scrollToItemBoundary
属性被设置为yes
,当你调用这个方法之后carousel
会自动滚动到最近的item
索引。 - (void) scrollByNumberOfItems:(NSInteger)itemCount duration:(NSTimeInterval)duration;
这个方法允许你使用一个固定的距离滚动carousel
,以carousel
的item
宽度来衡量。
整数或负数可能由itemCount
来具体确定,取决于你希望滚动的方向。
iCarousel
很好的处理了边界问题,
所以如果你指定了一个大于carousel
中items
数量的值,
滚动或者在到达carousel
底部时被夹紧(如果打包被禁止),或者无停顿地包裹。- (void) scrollToItemAtIndex:(NSInteger)index duration:(NSTimeInterval)duration;
这个方法允许你来控制carousel
使用 多长时间来滚动到特定的索引。- (void) scrollToItemAtIndex:(NSInteger)index animated:(BOOL)animated;
这个方法会使carousel
居中在一个特定的item
, 立即或者使用一个平滑的动画。对于打包的carousels
,carousel
将会自动决定滚动的最短(直线会或者包着的)距离。如果你需要控制这个滚动的方向,或者想滚动多于一个分辨率,使用scrollByNumberOfItems
这个方法。-
- (UIView *) itemViewAtIndex:(NSInteger)index;
返回带有指定索引的可见的item
视图。注意:这个索引和
carousel
的位置有关,且不是在visibleItemViews
数组中的位置,这可能是不一样的。传递一个赋值或者一个大于等于numberOfItems
的整数来取回占位视图。这个方法只有在是可见视图且情况下才工作,且如果这个在指定索引处的视图还没被加载时,或者这个索引超出范围时,将返回空。 - (NSInteger) indexOfItemView:(UIView *)view;
这个是carousel
中指定item view
的索引。对item views
和placeholder views
起作用,但是,placeholder view
索引并不和数据源中的索引匹配,且有可能是负值(查看上面indexesForVisibleItems
属性介绍的细节)。这个方法只对可见的item views
起作用且对目前没有加载的视图会返回NSNotFound
。对于一列所有加载的视图,使用visibleItemViews
属性。- (NSInteger) indexOfItemViewOrSubview:(UIView *)view;
这个方法给你或者是传递的视图或者是包含有作为参数的视图的视图的item
索引。它通过以传递进来的视图为开始,向上遍历视图层级,直到找到一个itemview
并返回他在carousel
中的索引。如果没有找到当前加载的item view
,它会返回NSNotFound
。这个方法对处理一个item view
内嵌的事件控制极其有用。它允许你绑定你的在控制器中控制单一行为方法的item
,且会找出控制触发相关行为的item
。详见Controls Demo example
。- (CGFloat) offsetForItemAtIndex:(NSInteger)index;
返回以itemWidth
整数倍来记的指定的item
索引处的偏移量。这是用于计算视图变换和alpha
的相同值,可以用于根据carousel
的位置自定义项目视图。每当调用carouselDidScroll:delegate
方法时,这个值都可以改变。- (UIView *) itemViewAtPoint:(CGPoint)point;
-
- (void) removeItemAtIndex:(NSInteger)index animated:(BOOL)animated;
这会从carousel
移除一个item
,剩下的项目将滑过来填补空位。注意:当该方法被指定时,数据源不会自动更新,因此后续调用reloadData将恢复已删除的项目。
- (void) insertItemAtIndex:(NSInteger)index animated:(BOOL)animated;
这将一个item
插入carousel
。 新的item
将从数据源中请求,因此,在调用此方法之前,请确保已将新项目添加到数据源数据,否则在carousel
中item
复用或其他问题。- (void) reloadItemAtIndex:(NSInteger)index animated:(BOOL)animated;
此方法将重新加载指定的item
。 新item
将从数据源请求。 如果animated
参数为YES
,则会从旧到新的item
视图交叉淡化,否则会立即交换。- (void) reloadData;
这个方法重新从数据源加载carousel
视图并刷新carousel
的显示。
iCarouselDataSource 代理方法
-
- (NSInteger) numberOfItemsInCarousel:(iCarousel *)carousel;
返回carousel
中界面的数量 -
- (UIView *) carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view;
返回一个在carousel
中要在指定索引处显示的视图,reusingView
参数的作用就像UIPickerView
,之前在carousel
中展示过的界面被传递到方法中来循环使用。如果这个参数不是空,你可以设置它的属性并返回它而不是创建一个新的视图实例,这样可以稍改善性能。与UITableView
不同,这里没有重用id
来区分不同的carousel
界面类型。所以如果你的carousel
包含多个不同的视图类型,那么每次这个方法被调用的时候,你应该只是忽略这个参数并返回一个新的视图。你应该确认carousel:viewForItemAtIndex:reusingView:
方法每次被调用时,它要么返回重用的视图,要么返回一个新的视图实例而不是保留你自己的循环视图池,因为不同的carousel
界面索引返回多个相同视图的复制品可能造成显示问题。 -
- (NSInteger) numberOfPlaceholdersInCarousel:(iCarousel *)carousel;
返回在carousel
中展示的占位视图。占位视图用来当carousel
中界面太少而不能填满carousel
的宽度,并且你希望在空白的地方显示一些东西时使用。它们随着carousel
移动并且像其他carousel
界面一样运行,但是它们不占numberOfItems
数量,且不能被设置为当前选中的界面。当打包属性被使能时占位视图被隐藏。占位视图或者显示在carousel
界面的任何一方。对于n个占位视图,前n/2
个界面将会出现在界面视图的左边,下一个n/2
个界面会出现在右边。你可以有奇数个占位视图,这种情况下carousel
会是不对称的。 -
- (UIView *) carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSInteger)index reusingView:(UIView *)view;
返回一个视图作为占位符视图。 工作方式与carousel:viewForItemAtIndex:reusingView:
相同。reusingView
的占位视图存储在单独的池中,用于常规轮播的重用视图,因此如果您的占位符视图与项目视图不同,则不会出现问题。
iCarouselDelegate 代理方法
-
- (void) carouselWillBeginScrollingAnimation:(iCarousel *)carousel;
只要carousel
开始动画,就会调用此方法。在用户滚动carousel
后,可以编程或自动触发,因为轮播重新对齐本身。 -
- (void) carouselDidEndScrollingAnimation:(iCarousel *)carousel;
当carousel
结束动画时,会调用此方法 -
- (void) carouselDidScroll:(iCarousel *)carousel;
无论何时滚动都会调用此方法。无论轮播是以编程方式滚动还是通过用户交互来调用它。 -
- (void) carouselCurrentItemIndexDidChange:(iCarousel *)carousel;
当carousel
滚动导致currentItemIndex
属性更改足够大时,就会调用此方法。无论item
的index
是按程序更新还是通过用户交互来调用。 -
- (void) carouselWillBeginDragging:(iCarousel *)carousel;
当用户开始拖动carousel
,会调用此方法。如果用户点击carousel
,或者如果carousel
以编程式滑动,则不会触发。 -
- (void) carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate;
当用户停止拖动carousel
时,会调用此方法。
willDecelerate
参数指示carousel
是否足够快地行进,以便在停止之前需要减速(即当前的索引不一定是它将停止的),或者它将停止在哪里。注意:即使
willDecelerate
为NO
时轮播仍将自动滚动,直到它完全对准当前索引。 如果您需要知道何时完全停止移动,请使用carouselDidEndScrollingAnimation
委托方法。 -
- (void) carouselWillBeginDecelerating:(iCarousel *)carousel;
当carousel完成减速时,会调用此方法,您可以理解为此时的currentItemIndex
是最终的停止值。 与以前的版本不同,在大多数情况下,carousel现在将停止在最终的索引位置。 唯一的例外是启用弹跳的非包装carousel,其中,如果最终停止位置超出carousel的终点,则carousel将自动滚动,直到其完全对准结束索引。为了向后兼容,carousel将始终调用scrollToItemAtIndex:animated:
在完成减速后。如果您需要知道carousel全停止移动的时间,请使用carouselDidEndScrollingAnimation
委托方法。 -
- (BOOL) carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index;
如果用户点击任何轮播项目视图(不包括占位符视图),包括当前选定的视图,此方法将触发。 方法的目的是忽略旋转木马上的轻拍(tap
)事件。 如果返回YES
或不实现,则tap
将按照正常的方式进行处理,而转盘didSelectItemAtIndex:
方法将被调用。 如果返回NO
,轮播将忽略轻拍(tap
)事件,它将继续传播到下一视图层级。这是防止carousel终止由另一种视图进行处理的轻拍(tap
)事件的方法。 -
- (void) carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;
如果用户点击任何轮播项目视图(不包括占位符视图),包括当前选定的视图,此方法将触发。 如果用户点击当前所选视图中的控件(即作为UIControl
的子类的任何视图),此方法将不会触发。 -
- (CGFloat) carouselItemWidth:(iCarousel *)carousel;
返回carousel中每个项目的宽度,即每个item
的间距。如果方法未实现,则默认为由carousel返回的第一个item的宽度:viewForItemAtIndex:reusingView:
的dataSource方法。 如果从carousel返回的视图:viewForItemAtIndex:reusingView:
不正确(例如,如果视图的大小不同,或者在其背景图像中包含影响其影子的阴影或外部阴影,则此方法仅应用于裁剪或填充项目视图size
)。如果你只想放大视图,那么最好使用iCarouselOptionSpacing
值。 -
- (CATransform3D) carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform;
此方法可用于为每个carousel视图提供自定义变换。offset
是视图与传送带中间的距离。当前中心的item视图的offset
为0.0
,右边的offset
为1.0
,左侧的offset
为-1.0
,依此类推。为了实现线性轮播样式,因此,您只需将offse
t乘以项宽,并将其用作变换的x
值即可。仅当轮播类型为iCarouselTypeCustom
时,才会调用此方法。 -
- (CGFloat) carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value;
此方法用于定制标准carousel的参数类型。 通过实现这种方法,您可以调整选项,例如圆形转盘中显示的项目数量或封面流转盘中的倾斜量,以及转盘是否换行,以及是否应在最终淡出等。 对于任何选项,您对调整不感满意,只需返回默认值即可。 这些选项的含义列在下面的iCarouselOption
值下。 在Options Demo中查看该方法的高级用法。 -
- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;
如果用户点击任何carousel item视图(不包括占位符视图),包括当前选定的视图,则将触发此方法。 如果用户在当前选定的视图(即,作为UIControl的子类的任何视图)中点击控件,该方法将不会触发。 -
- (BOOL)carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index;
如果用户点击任何carousel item视图(不包括占位符视图),包括当前选定的视图,则将触发此方法。 此方法的目的是使您有机会忽略carousel上的点击。 如果从该方法返回YES或未实现,则将按常规处理点击事件并调用carousel:didSelectItemAtIndex:
方法。 如果返回NO,carousel将忽略点击事件,它将继续沿视图层次结构传播。 这是防止carousel拦截其他视图要处理的点击事件的好方法。