iCarousel 1.8.3版本简介

原文链接: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)。

线程安全

iCarouselUIView的子类,和所有的UIKit组件一样,它只能从主线程访问。 您可能希望使用线程加载或更新轮播内容或项目,但始终确保一旦您的内容加载,您在更新轮播之前切换回主线程。

变色龙支持

iCarousel现在与Chameleon iOS-to-Mac转换库(https://github.com/BigZaphod/Chameleon)兼容。 要使用iCarouselChameleon,请将USING_CHAMELEON添加到项目的预处理器宏中。 查看Chameleon Demo示例项目,了解如何使用Chameleon将iOS iCarousel应用程序移植到Mac OS - 该示例演示如何使用Chameleon在Mac OS上运行No Nib iPhone示例。 请注意,点击中心当前不起作用,滚动操作必须使用双指滚动手势进行,而不是单击拖动(这两个都是由于变色龙UIGestureRecognizer实现的功能/限制)。

视图点击检测

在iOS上的iCarousel中,有两种基本方法来检测视图上的点击。 第一种方法是简单地使用轮播didSelectItemAtIndex:delegate方法,每次点击一个项目时都会触发。 如果您只需要对当前居中的item进行操作,可以将currentItemIndex属性与此方法的index参数进行比较。或者,如果您想要更多的控制,您可以提供UIButtonUIControl作为项目视图,并自己处理触摸交互。 有关如何完成此操作的示例,请参阅Buttons Demo示例项目(在Mac OS上不起作用)。您还可以在项目视图中嵌套UIControls,并且将按预期接收触摸(参见示例"Controls Demo")。如果您想检测其他类型的互动,例如滑动,双抽头或长按,最简单的方法是将UIGestureRecognizer附加到您的项目视图或其子视图在传递给carousel之前。

请注意,任何tapgestures在除中心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
    RotaryCylinderWheel改变时要显示的items的数量。 通常,这是根据视图尺寸和carousel中item的数量自动计算的,但是如果您想更精确地控制carousel的展示,则可以重新赋值。 此属性用于计算carousel的半径,而另一个选择是直接更改半径。
  • iCarouselOptionCount
    RotaryCylinderWheel类型中显示的 item 的数量。通常,这是根据轮播中的视图大小和item 的数量自动计算的,但如果要更精确地控制 carousel 的显示,则可以重写此选项。该属性用于计算 carousel半径,因此另一个选项是直接操作半径。
  • iCarouselOptionArc
    RotaryCylinderWheel变换的弧度(以弧度为单位)。 通常,默认值为2 * M_PI(一个完整的圆)。您也可以指定一个较小的值(例如,值M_PI将创建一个半圆或圆柱)。此属性用于计算carousel半径和角度步长,另一个选择是直接更改这些值。
  • iCarouselOptionRadius
    RotaryCylinderWheel的半径以pixelspoints为单位进行转换。 这个属性通常会进行计算以使可见的items适合指定的弧。 您可以修改这个值来增加或减少item的间距(和圆的半径)。
  • iCarouselOptionAngle
    RotaryCylinderWheel变换中每个项目之间的角度步长(以弧度为单位)。 在不更改半径的情况下修改该值会在carousel的末端造成间隙或导致item重叠。
  • iCarouselOptionTilt
    应用于CoverFlowCoverFlow2TimeMachine的carousel类型中非居中item的倾斜度。 此值应在0.01.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.00.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
    这个属性用于iCarouselTypeCoverFlow2carousel变换。它是被暴露的以便于你可以使用carousel:itemTransformForOffset:baseTransform:代理方法实现自己的CoverFlow2样式变量。

  • (BOOL) stopAtItemBoundary
    默认情况下,carousel被轻击时会停在一个准确的item边界。如果你设置这个值为no,他会自然停止,如果scrollToItemBoundary被设置为yes会滚回或者向前滚动到最接近的边界。

  • (BOOL) scrollToItemBoundary
    默认情况下,不管carousel何时停止移动,他会自动滚动到最近的item边界。如果你设置这个属性为nocarousel停止后将不会滚动且不管在哪儿他都会停下来,即使它不是正好对准当前的索引。有一个特例是如果打包效果被禁止且bounces被设置为yes,当它停下来时超出了carousel的底部,carousel会自动滚回第一个或者最后一个索引 。

  • (BOOL) ignorePerpendicularSwipes
    如果为yescarousel将会忽略垂直于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,以carouselitem宽度来衡量。
    整数或负数可能由itemCount来具体确定,取决于你希望滚动的方向。
    iCarousel很好的处理了边界问题,
    所以如果你指定了一个大于carouselitems数量的值,
    滚动或者在到达carousel底部时被夹紧(如果打包被禁止),或者无停顿地包裹。

  • - (void) scrollToItemAtIndex:(NSInteger)index duration:(NSTimeInterval)duration;
    这个方法允许你来控制carousel使用 多长时间来滚动到特定的索引。

  • - (void) scrollToItemAtIndex:(NSInteger)index animated:(BOOL)animated;
    这个方法会使carousel居中在一个特定的item, 立即或者使用一个平滑的动画。对于打包的carouselscarousel将会自动决定滚动的最短(直线会或者包着的)距离。如果你需要控制这个滚动的方向,或者想滚动多于一个分辨率,使用scrollByNumberOfItems这个方法。

  • - (UIView *) itemViewAtIndex:(NSInteger)index;
    返回带有指定索引的可见的item视图。

    注意:这个索引和carousel的位置有关,且不是在visibleItemViews数组中的位置,这可能是不一样的。传递一个赋值或者一个大于等于numberOfItems的整数来取回占位视图。这个方法只有在是可见视图且情况下才工作,且如果这个在指定索引处的视图还没被加载时,或者这个索引超出范围时,将返回空。

  • - (NSInteger) indexOfItemView:(UIView *)view;
    这个是carousel中指定item view的索引。对item viewsplaceholder 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将从数据源中请求,因此,在调用此方法之前,请确保已将新项目添加到数据源数据,否则在carouselitem复用或其他问题。

  • - (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属性更改足够大时,就会调用此方法。无论itemindex是按程序更新还是通过用户交互来调用。
  • - (void) carouselWillBeginDragging:(iCarousel *)carousel;
    当用户开始拖动carousel,会调用此方法。如果用户点击carousel,或者如果carousel以编程式滑动,则不会触发。
  • - (void) carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate;
    当用户停止拖动carousel时,会调用此方法。
    willDecelerate参数指示carousel是否足够快地行进,以便在停止之前需要减速(即当前的索引不一定是它将停止的),或者它将停止在哪里。

    注意:即使willDecelerateNO时轮播仍将自动滚动,直到它完全对准当前索引。 如果您需要知道何时完全停止移动,请使用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视图的offset0.0,右边的offset1.0,左侧的offset-1.0,依此类推。为了实现线性轮播样式,因此,您只需将offset乘以项宽,并将其用作变换的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拦截其他视图要处理的点击事件的好方法。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,561评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,218评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,162评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,470评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,550评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,806评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,951评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,712评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,166评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,510评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,643评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,306评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,930评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,745评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,983评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,351评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,509评论 2 348

推荐阅读更多精彩内容