iOS 特效 - iCarousel
iCarousel 是一个旨在简化 iPhone、iPad 和 Mac OS 上各种类型的轮播(分页、滚动视图)的实现的类。iCarousel 实现了许多常见的效果,例如圆柱形、平面和“CoverFlow”风格的轮播,并提供钩子来实现您自己的定制效果。与许多其他“CoverFlow”库不同,iCarousel 可以处理任何类型的视图,而不仅仅是图像,因此它非常适合在您的应用程序中以流畅且令人印象深刻的方式呈现分页数据。它还使得以最少的代码更改在不同的轮播效果之间切换变得非常容易。
支持的操作系统和 SDK 版本
- 支持的构建目标 - iOS 10.0 / Mac OS 10.12(Xcode 8.0,Apple LLVM 编译器 8.0)
- 最早支持的部署目标 - iOS 5.0 / Mac OS 10.7
- 最早的兼容部署目标 - iOS 4.3 / Mac OS 10.6
注意:“支持”表示该库已经过此版本的测试。“兼容”意味着库应该在这个操作系统版本上工作(即它不依赖于任何不可用的 SDK 功能)但不再进行兼容性测试,可能需要调整或错误修复才能正确运行。
ARC兼容性
从 1.8 版开始,iCarousel 需要 ARC。如果您希望在非 ARC 项目中使用 iCarousel,只需将 -fobjc-arc 编译器标志添加到 iCarousel.m 类。为此,请转到目标设置中的 Build Phases 选项卡,打开 Compile Sources 组,双击列表中的 iCarousel.m 并在弹出窗口中键入 -fobjc-arc。
如果您希望将整个项目转换为 ARC,请在 iCarousel.m 中注释掉 #error 行,然后在 Xcode 中运行 Edit > Refactor > Convert to Objective-C ARC... 工具并确保您希望转换的所有文件使用 ARC 进行(包括 iCarousel.m)检查。
线程安全
iCarousel 派生自 UIView 并且 - 与所有 UIKit 组件一样 - 它只能从主线程访问。您可能希望使用线程来加载或更新轮播内容或项目,但始终确保一旦您的内容加载完毕,您就可以在更新轮播前切换回主线程。
安装
要在应用程序中使用 iCarousel 类,只需将 iCarousel 类文件(不需要演示文件和资产)拖到您的项目中并添加 QuartzCore 框架。您也可以使用 Cocoapods 以正常方式安装它。
轮播类型
iCarousel 支持以下内置显示类型:
- iCarouselTypeLinear
- iCarouselTypeRotary
- iCarouselTypeInvertedRotary
- iCarouselTypeCylinder
- iCarouselTypeInvertedCylinder
- iCarouselTypeWheel
- iCarouselTypeInvertedWheel
- iCarouselTypeCoverFlow
- iCarouselTypeCoverFlow2
- iCarouselTypeTimeMachine
- iCarouselTypeInvertedTimeMachine
您还可以使用iCarouselTypeCustom
和carousel:itemTransformForOffset:baseTransform:
委托方法实现自己的定制轮播样式。
注意:iCarouselTypeCoverFlow
和iCarouselTypeCoverFlow2
类型之间的区别非常微妙,但是 for 的逻辑要iCarouselTypeCoverFlow2
复杂得多。如果您轻弹转盘,它们基本上是相同的,但是如果您用手指缓慢拖动转盘,则差异应该很明显。iCarouselTypeCoverFlow2
旨在尽可能接近地模拟标准 Apple CoverFlow 效果,并且将来可能会为了该目标而进行微妙的更改。
显示类型可视化示例
线性
旋转式
倒转
圆筒
倒置气缸
Cover Flow功能
特性
iCarousel 具有以下属性(注意:对于 Mac OS,在使用属性时将 NSView 替换为 UIView):
@property (nonatomic, weak) IBOutlet id dataSource;
一个支持 iCarouselDataSource 协议并可以提供视图来填充轮播的对象。
@property (nonatomic, weak) IBOutlet id delegate;
一个支持 iCarouselDelegate 协议并且可以响应轮播事件和布局请求的对象。
@property (nonatomic, assign) iCarouselType type;
用于切换轮播显示类型(详见上文)。
@property (nonatomic, assign) CGFloat perspective;
用于调整各种 3D 轮播视图的透视缩短效果。应为负值,小于 0 且大于 -0.01。超出此范围的值将产生非常奇怪的结果。默认值为 -1/500 或 -0.005;
@property (nonatomic, assign) CGSize contentOffset;
此属性用于调整轮播项目视图相对于轮播中心的偏移。它默认为 CGSizeZero,这意味着轮播项目居中。更改此值会移动轮播项目而不改变其视角,即消失点随轮播项目移动,因此如果您将轮播项目向下移动,则不会看起来好像您在俯视轮播。
@property (nonatomic, assign) CGSize viewpointOffset;
此属性用于调整相对于轮播项目的用户视角。它与调整 contentOffset 有相反的效果,即如果您向上移动视点,则轮播似乎向下移动。与 contentOffset 不同,移动视点也会改变相对于旋转木马项目的透视消失点,因此如果您向上移动视点,它会看起来好像您在俯视旋转木马。
@property (nonatomic, assign) CGFloat decelerationRate;
旋转木马在轻弹时减速的速率。较高的值意味着较慢的减速。默认值为 0.95。值应在 0.0(释放时旋转木马立即停止)到 1.0(旋转木马无限期地继续而不减速,除非它到达终点)的范围内。
@property (nonatomic, assign) BOOL bounces;
设置旋转木马是应该弹过终点并返回,还是停止不动。请注意,这对设计为包装的轮播类型或 carouselShouldWrap 委托方法返回 YES 的类型没有影响。
@property (nonatomic, assign) CGFloat bounceDistance;
未包裹的传送带越过末端时反弹的最大距离。这是以 itemWidth 的倍数来衡量的,因此值 1.0 表示轮播将反弹整个项目宽度,值 0.5 表示项目宽度的一半,依此类推。默认值为 1.0;
@property (nonatomic, assign, getter = isScrollEnabled) BOOL scrollEnabled;
启用和禁用用户滚动轮播。如果此属性设置为 NO,则仍然可以通过编程方式滚动轮播。
@property (nonatomic, readonly, getter = isWrapEnabled) BOOL wrapEnabled;
如果启用包装,则返回 YES,否则返回 NO。此属性是只读的。如果您希望覆盖默认值,请实现carousel:valueForOption:withDefault:
委托方法并为 返回一个值iCarouselOptionWrap
。
@property (nonatomic, assign, getter = isPagingEnabled) BOOL pagingEnabled;
启用和禁用分页。启用分页后,轮播将在用户滚动时在每个项目视图处停止,这与 UIScrollView 的 pagingEnabled 属性非常相似。
@property (nonatomic, readonly) NSInteger numberOfItems;
轮播中的项目数(只读)。要设置它,请实现numberOfItemsInCarousel:
dataSource 方法。请注意,并非所有这些项目视图都会在给定的时间点加载或可见 - 轮播在滚动时按需加载项目视图。
@property (nonatomic, readonly) NSInteger numberOfPlaceholders;
要在轮播中显示的占位符视图的数量(只读)。要设置它,请实现numberOfPlaceholdersInCarousel:
dataSource 方法。
@property (nonatomic, readonly) NSInteger numberOfVisibleItems;
屏幕上同时显示的轮播项目视图的最大数量(只读)。此属性对于性能优化很重要,并且会根据轮播类型和视图框架自动计算。如果您希望覆盖默认值,请实现carousel:valueForOption:withDefault:
委托方法并为 iCarouselOptionVisibleItems 返回一个值。
@property (nonatomic, strong, readonly) NSArray *indexesForVisibleItems;
一个数组,包含当前加载和在轮播中可见的所有项目视图的索引,包括占位符视图。该数组包含 NSNumber 对象,其整数值与视图的索引匹配。项目视图的索引从零开始并匹配传递给 dataSource 以加载视图的索引,但是任何可见占位符视图的索引要么是负数(小于零)要么大于或等于numberOfItems
。此数组中占位符视图的索引不等同于与 dataSource 一起使用的占位符视图索引。
@property (nonatomic, strong, readonly) NSArray *visibleItemViews;
当前显示在轮播中的所有项目视图的数组(只读)。这包括任何可见的占位符视图。此数组中的视图索引与项目索引不匹配,但是这些视图的顺序与 visibleItemIndexes 数组属性的顺序匹配,即您可以通过从visibleItemIndexes 数组(或者,您可以只使用该indexOfItemView:
方法,这要容易得多)。
@property (nonatomic, strong, readonly) UIView *contentView;
包含轮播项目视图的视图。如果您想将它们与轮播项目散布,您可以向此视图添加子视图。如果您希望视图出现在所有轮播项目的前面或后面,您应该将其直接添加到 iCarousel 视图本身。请注意,当应用程序运行时, contentView 中的视图顺序会经常发生且未记录的更改。添加到 contentView 的任何视图都应将其 userInteractionEnabled 属性设置为 NO 以防止与 iCarousel 的触摸事件处理发生冲突。
@property (nonatomic, assign) CGFloat scrollOffset;
这是轮播的当前滚动偏移量,是 itemWidth 的倍数。这个值,四舍五入到最接近的整数,是 currentItemIndex 值。您可以使用此值在轮播移动时定位其他屏幕元素。如果您希望以编程方式将轮播滚动到特定偏移量,也可以设置该值。如果您希望禁用内置手势处理并提供您自己的实现,这可能很有用。
@property (nonatomic, readonly) CGFloat offsetMultiplier;
这是用户用手指拖动轮播时使用的偏移乘数。它不影响编程滚动或减速速度。对于大多数轮播类型,这默认为 1.0,但对于 CoverFlow 风格的轮播默认为 2.0,以补偿它们的项目间隔更近的事实,因此必须进一步拖动以移动相同的距离。您不能直接设置此属性,但可以通过实现carouselOffsetMultiplier:
委托方法来覆盖默认值。
@property (nonatomic, assign) NSInteger currentItemIndex;
轮播中当前居中项目的索引。设置此属性等效于scrollToItemAtIndex:animated:
将动画参数设置为 NO进行调用。
@property (nonatomic, strong, readonly) UIView *currentItemView;
轮播中当前居中的项目视图。此视图的索引匹配currentItemIndex
。
@property (nonatomic, readonly) CGFloat itemWidth;
轮播中项目的显示宽度(只读)。这是从使用carousel:viewForItemAtIndex:reusingView:
dataSource 方法传递给轮播的第一个视图自动派生的。您还可以使用carouselItemWidth:
委托方法覆盖此值,这将更改为轮播项目分配的空间(但不会调整项目视图的大小或缩放)。
@property (nonatomic, assign) BOOL centerItemWhenSelected;
当设置为 YES 时,点击轮播中除与 currentItemIndex 匹配的项目之外的任何项目都会使其平滑地动画到中心。点击当前选定的项目将不起作用。默认为是。
@property (nonatomic, assign) CGFloat scrollSpeed;
这是用户用手指轻弹轮播时的滚动速度倍增器。默认为 1.0。
@property (nonatomic, readonly) CGFloat toggle;
此属性用于iCarouselTypeCoverFlow2
轮播变换。它是公开的,以便您可以使用carousel:itemTransformForOffset:baseTransform:
委托方法实现自己的 CoverFlow2 样式变体。
@property (nonatomic, assign) BOOL stopAtItemBoundary;
默认情况下,轮播将在轻弹时停在确切的项目边界处。如果将此属性设置为 NO,它将自然停止,然后 - 如果 scrollToItemBoundary 设置为 YES - 向后或向前滚动到最近的边界。
@property (nonatomic, assign) BOOL scrollToItemBoundary;
默认情况下,当轮播停止移动时,它会自动滚动到最近的项目边界。如果将此属性设置为 NO,则轮播在停止后将不会滚动并停留在它所在的位置,即使它在当前索引上没有完全对齐。例外情况是,如果 wrapping 被禁用并bounces
设置为 YES,那么无论此设置如何,如果轮播结束后停止,轮播将自动滚动回第一个或最后一个项目索引。
@property (nonatomic, assign, getter = isVertical) BOOL vertical;
此属性切换轮播是在屏幕上水平显示还是垂直显示。所有内置的轮播类型都适用于两个方向。切换到垂直会更改轮播的布局以及屏幕上滑动检测的方向。请注意,自定义轮播变换不受此属性影响,但滑动手势方向仍会受到影响。
@property (nonatomic, readonly, getter = isDragging) BOOL dragging;
如果用户已开始滚动轮播但尚未释放它,则返回 YES。
@property (nonatomic, readonly, getter = isDecelerating) BOOL decelerating;
如果用户不再拖动轮播,但它仍在移动,则返回 YES。
@property (nonatomic, readonly, getter = isScrolling) BOOL scrolling;
如果当前正在以编程方式滚动轮播,则返回 YES。
@property (nonatomic, assign) BOOL ignorePerpendicularSwipes;
如果是,则轮播将忽略与轮播方向垂直的滑动手势。所以对于水平轮播,垂直滑动不会被拦截。这意味着您可以在旋转木马项目视图中拥有一个垂直滚动的 scrollView,它仍然可以正常工作。默认为是。
@property (nonatomic, assign) BOOL clipsToBounds;
这实际上不是 iCarousel 的属性,而是继承自 UIView。它包含在此处是因为它是一个经常被遗漏的功能。将此设置为 YES 以防止轮播项目视图溢出其边界。您可以通过勾选“剪辑子视图”选项在界面生成器中设置此属性。默认为否。
@property (nonatomic, assign) CGFloat autoscroll;
此属性可用于设置轮播以恒定速度滚动。值为 1.0 将以每秒一项的速度向前滚动轮播。自动滚动值可以为正也可以为负,默认为 0.0(固定)。如果用户与轮播交互,自动滚动将停止,并在他们停止时恢复。
方法
iCarousel 类具有以下方法(注意:对于 Mac OS,在方法参数中用 NSView 替换 UIView):
- (void)scrollToItemAtIndex:(NSInteger)index animated:(BOOL)animated;
这将使轮播在指定的项目上居中,无论是立即还是平滑的动画。对于包裹式轮播,轮播将自动确定要滚动的最短(直接或环绕)距离。如果您需要控制滚动方向,或者想要滚动一圈以上,请改用 scrollByNumberOfItems 方法。
- (void)scrollToItemAtIndex:(NSInteger)index duration:(NSTimeInterval)scrollDuration;
此方法允许您控制轮播滚动到指定索引所需的时间。
- (void)scrollByNumberOfItems:(NSInteger)itemCount duration:(NSTimeInterval)duration;
此方法允许您将轮播滚动固定距离,以轮播项目宽度为单位。可以为 itemCount 指定正值或负值,具体取决于您希望滚动的方向。iCarousel 优雅地处理边界问题,因此如果您指定的距离大于轮播中项目的数量,滚动将在到达轮播结束时被限制(如果环绕被禁用)或无缝环绕。
- (void)scrollToOffset:(CGFloat)offset duration:(NSTimeInterval)duration;
这与 的工作方式相同scrollToItemAtIndex:
,但允许您滚动到小数偏移量。如果您希望获得非常精确的动画效果,这可能很有用。请注意,如果该scrollToItemBoundary
属性设置为 YES,则调用此方法后,轮播将自动滚动到最近的项目索引。反正。
- (void)scrollByOffset:(CGFloat)offset duration:(NSTimeInterval)duration;
这与 的工作方式相同scrollByNumberOfItems:
,但允许您滚动项目的小数部分。如果您希望获得非常精确的动画效果,这可能很有用。请注意,如果该scrollToItemBoundary
属性设置为 YES,则无论如何调用此方法后,轮播都会自动滚动到最近的项目索引。
- (void)reloadData;
这将从数据源重新加载所有轮播视图并刷新轮播显示。
- (UIView *)itemViewAtIndex:(NSInteger)index;
返回具有指定索引的可见项视图。请注意,索引与轮播中的位置有关,而不是在visibleItemViews
数组中的位置,这可能会有所不同。传递负索引或大于或等于的索引numberOfItems
以检索占位符视图。该方法仅适用于可见的项目视图,如果指定索引处的视图尚未加载,或者索引超出范围,则返回 nil。
- (NSInteger)indexOfItemView:(UIView *)view;
轮播中给定项目视图的索引。适用于项目视图和占位符视图,但是占位符视图索引与数据源使用的索引不匹配,并且可能为负数(indexesForVisibleItems
有关更多详细信息,请参阅上面的属性)。此方法仅适用于可见的项目视图,并且将为当前未加载的视图返回 NSNotFound。要获取所有当前加载的视图的列表,请使用该visibleItemViews
属性。
- (NSInteger)indexOfItemViewOrSubview:(UIView *)view
此方法为您提供传递的视图或包含作为参数传递的视图的视图的项目索引。它的工作方式是从传递的视图开始沿着视图层次结构向上移动,直到找到一个项目视图并在轮播中返回其索引。如果未找到当前加载的项目视图,则返回 NSNotFound。此方法对于处理嵌入在项目视图中的控件上的事件非常有用。这允许您将所有项目控件绑定到视图控制器上的单个操作方法,然后确定触发操作的控件与哪个项目相关。您可以在Controls Demo示例项目中看到此技术的示例。
- (CGFloat)offsetForItemAtIndex:(NSInteger)index;
itemWidth
以中心位置的倍数返回指定项索引的偏移量。这与用于计算视图变换和 alpha 的值相同,可用于根据它们在轮播中的位置自定义项目视图。每当carouselDidScroll:
调用委托方法时,每个视图的这个值都会发生变化。
- (UIView *)itemViewAtPoint:(CGPoint)point;
返回轮播边界内指定点的最前面的项目视图。用于实现您自己的点击检测。
- (void)removeItemAtIndex:(NSInteger)index animated:(BOOL)animated;
这将从轮播中删除一个项目。其余项目将滑过以填补空白。请注意,调用此方法时数据源不会自动更新,因此后续调用 reloadData 将恢复已删除的项目。
- (void)insertItemAtIndex:(NSInteger)index animated:(BOOL)animated;
这会将一个项目插入到轮播中。新的item会从dataSource中请求,所以在调用这个方法之前要确保新的item已经添加到数据源data中,否则会在carousel中得到重复的item,或者其他怪事。
- (void)reloadItemAtIndex:(NSInteger)index animated:(BOOL)animated;
此方法将重新加载指定的项目视图。将从数据源请求新项目。如果动画参数为 YES,它将从旧项目视图交叉淡入淡出到新项目视图,否则将立即交换。
协议
iCarousel 通过提供两个协议接口 iCarouselDataSource 和 iCarouselDelegate 来遵循 Apple 的数据驱动视图约定。iCarouselDataSource 协议具有以下必需的方法(注意:对于 Mac OS,在方法参数中用 NSView 替换 UIView):
- (NSUInteger)numberOfItemsInCarousel:(iCarousel *)carousel;
返回轮播中的项目(视图)数。
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(UIView *)view;
返回要显示在轮播中指定索引处的视图。该reusingView
参数的工作方式类似于 UIPickerView,其中先前显示在轮播中的视图被传递回要回收的方法。如果这个参数不是 nil,你可以设置它的属性并返回它,而不是创建一个新的视图实例,这会稍微提高性能。与 UITableView 不同,没有用于区分不同轮播视图类型的重用标识符,因此如果您的轮播包含多个不同的视图类型,那么您应该忽略此参数并在每次调用该方法时返回一个新视图。您应该确保每次carousel:viewForItemAtIndex:reusingView:
方法被调用时,它要么返回 reusingView 要么返回一个全新的视图实例,而不是维护自己的可回收视图池,因为为不同的轮播项目索引返回同一视图的多个副本可能会导致轮播显示问题。
iCarouselDataSource 协议有以下可选方法:
- (NSUInteger)numberOfPlaceholdersInCarousel:(iCarousel *)carousel;
返回要在轮播中显示的占位符视图的数量。当轮播中的项目数量太少而无法填充轮播宽度,并且您希望在空白空间中显示某些内容时,将使用占位符视图。它们与轮播一起移动并且行为与任何其他轮播项目一样,但它们不计入 numberOfItems 值,并且不能设置为当前选定的项目。启用换行时,占位符会隐藏。占位符出现在轮播项目的两侧。对于 n 个占位符视图,前 n/2 个项目将出现在项目视图的左侧,接下来的 n/2 个项目将出现在右侧。您可以有奇数个占位符,在这种情况下,轮播将是不对称的。
- (UIView *)carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSUInteger)index reusingView:(UIView *)view;
返回要显示为占位符视图的视图。工作方式与carousel:viewForItemAtIndex:reusingView:
. 占位符 reusingViews 与用于常规轮播的 reusingViews 存储在单独的池中,因此如果您的占位符视图与项目视图不同,这不是问题。
iCarouselDelegate 协议具有以下可选方法:
- (void)carouselWillBeginScrollingAnimation:(iCarousel *)carousel;
每当轮播开始动画滚动时,都会调用此方法。这可以在用户完成滚动轮播后以编程方式或自动触发,因为轮播会重新对齐自身。
- (void)carouselDidEndScrollingAnimation:(iCarousel *)carousel;
当轮播结束动画滚动时调用此方法。
- (void)carouselDidScroll:(iCarousel *)carousel;
每当滚动轮播时都会调用此方法。无论轮播是通过编程还是通过用户交互滚动,它都会被调用。
- (void)carouselCurrentItemIndexDidChange:(iCarousel *)carousel;
每当轮播滚动到足以改变 currentItemIndex 属性时,就会调用此方法。无论项目索引是以编程方式更新还是通过用户交互更新,都会调用它。
- (void)carouselWillBeginDragging:(iCarousel *)carousel;
当用户开始拖动轮播时调用此方法。如果用户点击/点击轮播,或者轮播以编程方式滚动,它不会触发。
- (void)carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate;
当用户停止拖动轮播时调用此方法。willDecelerate 参数指示转盘是否行得足够快以至于它在停止之前需要减速(即当前索引不一定是它将停止的索引),或者它是否会在它所在的位置停止。请注意,即使 willDecelerate 为 NO,轮播仍会自动滚动,直到它与当前索引完全对齐。如果您需要知道它何时完全停止移动,请使用 carouselDidEndScrollingAnimation 委托方法。
- (void)carouselWillBeginDecelerating:(iCarousel *)carousel;
当轮播开始减速时调用此方法。它通常会在 carouselDidEndDragging:willDecelerate: 方法之后立即调用,假设 willDecelerate 为 YES。
- (void)carouselDidEndDecelerating:(iCarousel *)carousel;
当轮播完成减速时调用此方法,您可以假设此时的 currentItemIndex 是最终停止值。与以前的版本不同,在大多数情况下,轮播现在将准确地停在最终索引位置。唯一的例外是启用了弹跳的非包裹式转盘,如果最终停止位置超出转盘的末端,则转盘将自动滚动,直到它与结束索引完全对齐。为了向后兼容,轮播将始终scrollToItemAtIndex:animated:
在完成减速后调用。如果您需要确定轮播何时完全停止移动,请使用carouselDidEndScrollingAnimation
委托方法。
- (CGFloat)carouselItemWidth:(iCarousel *)carousel;
返回轮播中每个项目的宽度 - 即每个项目视图的间距。如果未实现该方法,则默认为carousel:viewForItemAtIndex:reusingView:
dataSource 方法返回的第一个项目视图的宽度。如果从返回的视图carousel:viewForItemAtIndex:reusingView:
不正确(例如,如果视图大小不同,或者在其背景图像中包含影响其大小的投影或外部发光),则此方法应仅用于裁剪或填充项目视图- 如果您只是想要将视图隔开一点,那么最好使用该iCarouselOptionSpacing
值。
- (CATransform3D)carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform;
此方法可用于为每个轮播视图提供自定义转换。offset 参数是视图与旋转木马中间的距离。当前居中的项目视图的偏移量为 0.0,右侧的偏移值为 1.0,左侧的偏移值为 -1.0,依此类推。要实现线性轮播样式,您只需将偏移值乘以项目宽度并将其用作变换的 x 值。仅当轮播类型为 iCarouselTypeCustom 时才会调用此方法。
- (CGFloat)carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value;
该方法用于自定义标准轮播类型的参数。通过实施此方法,您可以调整选项,例如圆形转盘中显示的项目数量,或coverflow 转盘中的倾斜量,以及转盘是否应环绕以及是否应在末端淡出等. 对于任何您不想调整的选项,只需返回默认值即可。这些选项的含义在下面的iCarouselOption 值下列出。检查选项演示以获取使用此方法的高级示例。
- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;
如果用户点击任何轮播项目视图(不包括占位符视图),包括当前选择的视图,则会触发此方法。如果用户点击当前选定视图中的控件(即作为 UIControl 子类的任何视图),则不会触发此方法。
- (BOOL)carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index;
如果用户点击任何轮播项目视图(不包括占位符视图),包括当前选择的视图,则会触发此方法。方法的目的是让您有机会忽略轮播上的点击。如果你从方法中返回 YES,或者没有实现它,tap 将正常处理并carousel:didSelectItemAtIndex:
调用该方法。如果您返回 NO,轮播将忽略点击并继续向上传播视图层次结构。这是防止轮播拦截打算由另一个视图处理的点击事件的好方法。
检测项目视图上的点击
在 iOS 上的 iCarousel 中检测点击视图有两种基本方法。第一种方法是简单地使用carousel:didSelectItemAtIndex:
委托方法,每次点击项目时都会触发该方法。如果您只对点击当前居中的项目感兴趣,您可以将该currentItemIndex
属性与此方法的 index 参数进行比较。
或者,如果您想要更多控制,您可以提供 UIButton 或 UIControl 作为项目视图并自己处理触摸交互。有关如何完成此操作的示例,请参阅按钮演示示例项目(不适用于 Mac OS;见下文)。
您还可以在您的项目视图中嵌套 UIControls,这些将按预期接收触摸(请参阅Controls Demo示例项目以获取示例)。
如果您希望检测其他类型的交互,例如滑动、双击或长按,最简单的方法是将 UIGestureRecognizer 附加到您的项目视图或其子视图,然后再将其传递给轮播。
请注意,除了当前选定的项目视图之外,任何项目视图上的点击和手势都将被忽略,除非您将该centerItemWhenSelected
属性设置为 NO。
在 Mac OS 上,目前没有简单的方法可以在 iCarousel 项目视图中嵌入控件。您不能只在项目视图中或在项目视图中提供 NSButton,因为应用于项目视图的转换意味着命中检测无法正常工作。我正在研究可能的解决方案(如果您知道解决此问题的好方法,请与我们联系,或在 github 上 fork 项目)。
demo及常见问题:https://github.com/nicklockwood/iCarousel
源码下载:iCarousel-master.zip