原文鏈接:https://github.com/nicklockwood/iCarousel/blob/master/README.md#rotary
簡(jiǎn)介
iCarousel是一個(gè)類,旨在簡(jiǎn)化在iPhone,iPad和Mac OS上各種類型的輪播(頁(yè)面,滾動(dòng)視圖)的實(shí)現(xiàn)。 iCarousel實(shí)現(xiàn)了許多常見(jiàn)的效果,例如圓柱形,扁平和“ CoverFlow”風(fēng)格的旋轉(zhuǎn)木馬,并提供了掛鉤來(lái)實(shí)現(xiàn)您自己的定制效果。 與許多其他“ CoverFlow”庫(kù)不同,iCarousel可以使用任何類型的視圖,而不僅僅是圖像,因此它是在應(yīng)用程序中以流暢而令人印象深刻的方式呈現(xiàn)分頁(yè)數(shù)據(jù)的理想選擇。 它還使通過(guò)最少的代碼更改在不同的輪播效果之間切換變得非常容易。
支持 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”表示該庫(kù)已經(jīng)使用此版本進(jìn)行了測(cè)試。 “Compatible”表示該庫(kù)應(yīng)在此OS版本上運(yùn)行(即,它不依賴于任何不可用的SDK功能),但不再經(jīng)過(guò)兼容性測(cè)試,可能需要進(jìn)行調(diào)整或修正錯(cuò)誤才能正常運(yùn)行。
ARC兼容性
從1.8版開始,iCarousel需要ARC。 如果要在非ARC項(xiàng)目中使用iCarousel,只需將-fobjc-arc編譯器標(biāo)志添加到iCarousel.m類。 為此,請(qǐng)轉(zhuǎn)到目標(biāo)設(shè)置中的“構(gòu)建階段”選項(xiàng)卡,打開“編譯源”組,雙擊列表中的iCarousel.m,然后在彈出窗口中鍵入-fobjc-arc。如果要將整個(gè)項(xiàng)目轉(zhuǎn)換為ARC,請(qǐng)注釋掉iCarousel.m中的#error行,然后在Xcode中運(yùn)行“Edit > Refactor > Convert to Objective-C ARC...”
工具,并確保要轉(zhuǎn)換的所有文件 使用ARC進(jìn)行檢查(包括iCarousel.m)。
線程安全
iCarousel
是UIView
的子類,和所有的UIKit
組件一樣,它只能從主線程
訪問(wèn)。 您可能希望使用線程加載或更新輪播內(nèi)容或項(xiàng)目,但始終確保一旦您的內(nèi)容加載,您在更新輪播之前切換回主線程。
變色龍支持
iCarousel
現(xiàn)在與Chameleon iOS-to-Mac
轉(zhuǎn)換庫(kù)(https://github.com/BigZaphod/Chameleon)兼容。 要使用iCarousel
與Chameleon
,請(qǐng)將USING_CHAMELEON
添加到項(xiàng)目的預(yù)處理器宏中。 查看Chameleon Demo示例項(xiàng)目,了解如何使用Chameleon
將iOS iCarousel
應(yīng)用程序移植到Mac OS - 該示例演示如何使用Chameleon
在Mac OS上運(yùn)行No Nib iPhone
示例。 請(qǐng)注意,點(diǎn)擊中心當(dāng)前不起作用,滾動(dòng)操作必須使用雙指滾動(dòng)手勢(shì)進(jìn)行,而不是單擊拖動(dòng)(這兩個(gè)都是由于變色龍UIGestureRecognizer
實(shí)現(xiàn)的功能/限制)。
視圖點(diǎn)擊檢測(cè)
在iOS上的iCarousel
中,有兩種基本方法來(lái)檢測(cè)視圖上的點(diǎn)擊。 第一種方法是簡(jiǎn)單地使用輪播didSelectItemAtIndex:delegate
方法,每次點(diǎn)擊一個(gè)項(xiàng)目時(shí)都會(huì)觸發(fā)。 如果您只需要對(duì)當(dāng)前居中的item進(jìn)行操作,可以將currentItemIndex
屬性與此方法的index
參數(shù)進(jìn)行比較。或者,如果您想要更多的控制,您可以提供UIButton
或UIControl
作為項(xiàng)目視圖,并自己處理觸摸交互。 有關(guān)如何完成此操作的示例,請(qǐng)參閱Buttons Demo
示例項(xiàng)目(在Mac OS上不起作用)。您還可以在項(xiàng)目視圖中嵌套UIControls
,并且將按預(yù)期接收觸摸(參見(jiàn)示例"Controls Demo"
)。如果您想檢測(cè)其他類型的互動(dòng),例如滑動(dòng),雙抽頭或長(zhǎng)按,最簡(jiǎn)單的方法是將UIGestureRecognizer
附加到您的項(xiàng)目視圖或其子視圖在傳遞給carousel
之前。
請(qǐng)注意,任何
tap
和gestures
在除中心item外的任何item將被忽略,除非你將centerItemWhenSelected
屬性設(shè)置為NO
。
安裝
要在應(yīng)用程序中使用iCarousel類,只需將iCarousel類文件拖到您的項(xiàng)目中并添加QuartzCore框架。 您也可以按常規(guī)方式使用Cocoapods安裝它。
屬性和方法介紹
可選值(typedef NS_ENUM(NSInteger, iCarouselOption)
)
-
iCarouselOptionWrap
當(dāng)carousel滾動(dòng)到末尾時(shí)是否循環(huán)滾動(dòng)的布爾值。 如果你想carousel在結(jié)束時(shí)循環(huán)滾動(dòng)則返回YES
;如果你想其停止則返回NO
。 通常,circular類型的carousel默認(rèn)情況下會(huì)自動(dòng)循環(huán)滾動(dòng),而linear類型的carousel則不會(huì)。 返回類型是浮點(diǎn)值,除0.0
以外的任何值都將被視為YES。 -
iCarouselOptionShowBackfaces
對(duì)于某些carousel類型,例如iCarouselTypeCylinder
,可以看到某些視圖的背面(iCarouselTypeInvertedCylinder
默認(rèn)情況下隱藏背面)。 如果您希望隱藏朝后的視圖,則可以為此選項(xiàng)返回NO
。 要覆蓋iCarouselTypeInvertedCylinder
的默認(rèn)背面隱藏,可以返回YES
。 此選項(xiàng)也可用于由自定義的carousel的transforms
而導(dǎo)致的顯示視圖背面的問(wèn)題。 -
iCarouselOptionOffsetMultiplier
offset multiplier
是在用戶拖動(dòng)carousel時(shí)使用的。 它不影響編程式滾動(dòng)或減速速度。 對(duì)于大多數(shù)carousel類型,默認(rèn)值為1.0
,但是CoverFlow
樣式的carousels默認(rèn)值為2.0
(因?yàn)閕tem間隔較小,因此必須進(jìn)一步拖動(dòng)以移動(dòng)相同的距離)。 -
iCarouselOptionVisibleItems
Rotary
、Cylinder
和Wheel
改變時(shí)要顯示的items的數(shù)量。 通常,這是根據(jù)視圖尺寸和carousel中item的數(shù)量自動(dòng)計(jì)算的,但是如果您想更精確地控制carousel的展示,則可以重新賦值。 此屬性用于計(jì)算carousel的半徑,而另一個(gè)選擇是直接更改半徑。 -
iCarouselOptionCount
在Rotary
、Cylinder
和Wheel
類型中顯示的 item 的數(shù)量。通常,這是根據(jù)輪播中的視圖大小和item 的數(shù)量自動(dòng)計(jì)算的,但如果要更精確地控制 carousel 的顯示,則可以重寫此選項(xiàng)。該屬性用于計(jì)算 carousel半徑,因此另一個(gè)選項(xiàng)是直接操作半徑。 -
iCarouselOptionArc
Rotary
、Cylinder
和Wheel
變換的弧度(以弧度為單位)。 通常,默認(rèn)值為2 * M_PI
(一個(gè)完整的圓)。您也可以指定一個(gè)較小的值(例如,值M_PI
將創(chuàng)建一個(gè)半圓或圓柱)。此屬性用于計(jì)算carousel半徑和角度步長(zhǎng),另一個(gè)選擇是直接更改這些值。 -
iCarouselOptionRadius
Rotary
、Cylinder
和Wheel
的半徑以pixels
或points
為單位進(jìn)行轉(zhuǎn)換。 這個(gè)屬性通常會(huì)進(jìn)行計(jì)算以使可見(jiàn)的items適合指定的弧。 您可以修改這個(gè)值來(lái)增加或減少item的間距(和圓的半徑)。 -
iCarouselOptionAngle
Rotary
、Cylinder
和Wheel
變換中每個(gè)項(xiàng)目之間的角度步長(zhǎng)(以弧度為單位)。 在不更改半徑的情況下修改該值會(huì)在carousel的末端造成間隙或?qū)е耰tem重疊。 -
iCarouselOptionTilt
應(yīng)用于CoverFlow
、CoverFlow2
和TimeMachine
的carousel類型中非居中item的傾斜度。 此值應(yīng)在0.0
到1.0
的范圍內(nèi)。 -
iCarouselOptionSpacing
item的間距。 該值乘以item的寬度(或高度,如果carousel是垂直的)以得到每個(gè)item之間的總間距,默認(rèn)值為1.0
,表示視圖之間沒(méi)有間距(除非視圖已經(jīng)包含填充,就像在許多示例項(xiàng)目中的一樣)。 -
iCarouselOptionFadeMin && iCarouselOptionFadeMax && iCarouselOptionFadeRange && iCarouselOptionFadeMinAlpha
這四個(gè)選項(xiàng)是基于其相對(duì)于當(dāng)前居中項(xiàng)目的偏移量控制carousel的item的淡出方式。FadeMin
是項(xiàng)目視圖開始淡入之前可以達(dá)到的最小負(fù)偏移量。FadeMax
是視圖開始淡入之前可以達(dá)到的最大正偏移量。FadeRange
是淡出發(fā)生的距離,以item寬度的倍數(shù)度量(默認(rèn)為1.0),FadeMinAlpha
是視圖將淡入的最小alpha
值(默認(rèn)為0.0
,表示完全透明)。
-
(iCarouselType) type
用來(lái)變換carousel展示樣式,type 樣式如下:
typedef NS_ENUM(NSInteger, iCarouselType){
iCarouselTypeLinear = 0, //線性的 ---> [平鋪,不循環(huán)]
iCarouselTypeRotary, //可旋轉(zhuǎn)的 ---> [外環(huán),層疊]
iCarouselTypeInvertedRotary, //反向旋轉(zhuǎn)式 ---> [內(nèi)環(huán),層疊]
iCarouselTypeCylinder, //圓柱式 ---> [外環(huán),拼接]
iCarouselTypeInvertedCylinder, //反向圓柱式 ---> [內(nèi)環(huán),拼接]
iCarouselTypeWheel, //車輪式 ---> [車輪,扇形,影響比較大]
iCarouselTypeInvertedWheel, //反向車輪式 ---> [車輪,扇形,影響比較大]
iCarouselTypeCoverFlow, //封面流 ---> [翻頁(yè),不循環(huán)]
iCarouselTypeCoverFlow2, //封面流樣式2 ---> [翻頁(yè)2,不循環(huán)]
iCarouselTypeTimeMachine, //時(shí)光機(jī) ---> [向上堆疊,不循環(huán)]
iCarouselTypeInvertedTimeMachine, //反向時(shí)光機(jī) ---> [反堆疊,不循環(huán)]
iCarouselTypeCustom
};
(CGFloat) perspective
用來(lái)稍稍調(diào)整在多種3D carousel視圖中視覺(jué)按照透視法縮短效果的,它應(yīng)該是一個(gè)負(fù)數(shù),值的范圍在-0.01 ~ 0
(不包含 -0.01和 0),這個(gè)范圍之外的值將會(huì)產(chǎn)生非常奇怪的結(jié)果。默認(rèn)值是-1/500
或-0.005
。(CGFloat) decelerationRate
滑動(dòng)時(shí)carousel減速的速率。 值越高減速越慢。 默認(rèn)值為0.95
。 值的范圍應(yīng)在0.0~1.0
(0.0
表示carousel在released時(shí)立即停止;1.0
表示carousel持續(xù)滾動(dòng)且不會(huì)減速,除非到達(dá)終點(diǎn))。(CGFloat) scrollSpeed
用戶滑動(dòng)carousel時(shí)滑動(dòng)速度乘數(shù)。默認(rèn)值是1.0
。(CGFloat) bounceDistance
當(dāng)非循環(huán)的carousel滑動(dòng)超過(guò)末端時(shí)反彈的最大距離。 這是用itemWidth
的倍數(shù)來(lái)衡量的,因此值1.0
表示carousel會(huì)反彈一個(gè)完整的item寬度,值0.5
則表示反彈item寬度的一半,依此類推。 默認(rèn)值為1.0
。(BOOL) scrollEnabled
使能或者禁止用戶滾動(dòng)carousel。如果這個(gè)值被設(shè)為NO
,carousel仍然可以以編程方式被滾動(dòng)。(BOOL) pagingEnabled
啟用和禁用分頁(yè)。 啟用分頁(yè)后,carousel會(huì)在用戶滾動(dòng)時(shí)在每個(gè)item處停止,這與UIScrollView的pagesEnabled屬性非常相似。-
(BOOL) vertical
此屬性是切換carousel的在屏幕上的顯示方向(水平顯示或垂直顯示)。 所有內(nèi)置carousel類型都可以水平和垂直顯示。 可以通過(guò)更改carousel的布局或屏幕上的滑動(dòng)檢測(cè)方向來(lái)切換carousel到垂直方向。注意:自定義的carousel變換不受這個(gè)屬性影響,但切換手勢(shì)的方向仍然會(huì)受影響。
(BOOL) wrapEnabled
如果啟用了循環(huán)滾動(dòng)則返回YES
;否則,則返回NO
。 該屬性是只讀的。 如果你想重新賦值,需要實(shí)現(xiàn)carousel:valueForOption:withDefault:
委托方法,并為iCarouselOptionWrap
返回一個(gè)值。-
(BOOL) bounces
設(shè)置carousel是否應(yīng)彈跳到結(jié)尾并返回或突然停止。注意:在carousel樣式設(shè)置為循環(huán)樣式時(shí)或者
carouselShouldWrap
代理方法返回為YES
時(shí),這個(gè)屬性不起作用。 (CGFloat) scrollOffset
carousel的current scroll offset
,為itemWidth
的倍數(shù)。 該值四舍五入到最接近的整數(shù),是currentItemIndex
值。 當(dāng)carousel滑動(dòng)時(shí),您可以使用此值來(lái)定位其他屏幕元素。 如果希望以編程式將carousel滾動(dòng)到特定偏移也可以設(shè)置該值。 如果您希望禁用內(nèi)置手勢(shì)處理并提供自己的實(shí)現(xiàn)方式也可是使用該值。(CGFloat) offsetMultiplier
用戶拖動(dòng)carousel時(shí)使用的偏移乘數(shù)。 它不影響程序滾動(dòng)或減速速度。 對(duì)于大多數(shù)輪播類型,默認(rèn)值為1.0
,但是CoverFlow樣式輪播的默認(rèn)值為2.0
(因?yàn)閕tem間隔更近,因此必須進(jìn)一步拖動(dòng)以移動(dòng)相同的距離)。 您不能直接設(shè)置此屬性,但是可以通過(guò)實(shí)現(xiàn)carouselOffsetMultiplier:
這個(gè)代理方法對(duì)該值重新賦值。(CGSize) contentOffset
此屬性用于調(diào)整carousel的item相對(duì)于carousel中心的偏移量。 默認(rèn)為CGSizeZero
,表示carousel的items 居中。 更改此值將在不改變其角度的情況下移動(dòng)carousel的items,即消失點(diǎn)隨carousel的items一起移動(dòng),因此,如果您向下移動(dòng)carousel的items,它不會(huì)讓你看起來(lái)像是在俯視carousel。(CGSize) viewpointOffset
此屬性用于相對(duì)于carousel items調(diào)整用戶視點(diǎn)。 它與調(diào)整contentOffset
具有相反的效果,即如果您將視點(diǎn)向上移動(dòng),則carousel會(huì)向下移動(dòng)。 與contentOffset
不同,移動(dòng)視點(diǎn)還會(huì)更改相對(duì)于carousel items的透視消失點(diǎn),因此,如果將視點(diǎn)向上移動(dòng),則看起來(lái)就像在下面看carousel。-
(NSInteger) numberOfItems
carousel中items的數(shù)量(只讀)。 要進(jìn)行設(shè)置,請(qǐng)實(shí)現(xiàn)dataSource中numberOfItemsInCarousel:
方法。注意:并非所有這些item都會(huì)在給定的時(shí)間點(diǎn)被加載或顯示(carousel在滾動(dòng)時(shí)根據(jù)需要加載項(xiàng)視圖)。
(NSInteger) numberOfPlaceholders
在carousel中展示的占位視圖的數(shù)量(只讀)。可以通過(guò)實(shí)現(xiàn)numberOfPlaceholdersInCarousel:
方法改變numberOfPlaceholders
的值。(NSInteger) currentItemIndex
當(dāng)前carousel中居中的item 的索引,設(shè)置這個(gè)屬性相當(dāng)于調(diào)用scrollToItemAtIndex:animated:
方法時(shí)將animated
參數(shù)設(shè)置為NO
。(UIView *) currentItemView
當(dāng)前carousel中居中的item view。這個(gè)視圖的索引與currentItemIndex
匹配。(NSArray *) indexesForVisibleItems
一個(gè)數(shù)組包含當(dāng)前在輪播中加載和顯示的所有項(xiàng)視圖的索引,包括占位符視圖。 該數(shù)組包含NSNumber對(duì)象,其整數(shù)值與視圖的索引匹配。 項(xiàng)視圖的索引從零開始,并匹配傳遞給dataSource的索引以加載視圖,但任何可見(jiàn)占位符視圖的索引將為負(fù)(小于零)或大于或等于numberOfItems。 此數(shù)組中占位符視圖的索引不等于與dataSource一起使用的占位符視圖索引。(NSInteger) numberOfVisibleItems
同時(shí)顯示在屏幕上的carousel itemviews的最大數(shù)量(只讀)。這個(gè)屬性對(duì)執(zhí)行最優(yōu)化很重要,且是基于carousel的樣式和視圖的frame被自動(dòng)計(jì)算的。如果你想重寫這個(gè)默認(rèn)值,實(shí)現(xiàn)carousel:valueForOption:withDefault:
這個(gè)代理方法且給iCarouselOptionVisibleItems
返回一個(gè)值。(NSInteger) visibleItemViews
一個(gè)存放當(dāng)前carousel中展示的所有item views的數(shù)組(只讀),它包括任何可見(jiàn)的占位視圖。這個(gè)數(shù)組中視圖的索引并不與item的索引匹配,但這些視圖的順序與visibleItemIndexes
數(shù)組屬性中的順序匹配,你可以通過(guò)從visibleItemIndexes
數(shù)組中去掉對(duì)應(yīng)的對(duì)象來(lái)在這個(gè)數(shù)組中獲取一個(gè)指定視圖的索引(或者,你可以僅僅用indexOfItemView:
方法,這個(gè)會(huì)更簡(jiǎn)單)(CGFloat) itemWidth
carousel中展示的items
的寬度(只讀)。這是自動(dòng)從使用carousel:viewForItemAtIndex:reusingView:
數(shù)據(jù)源方法第一個(gè)傳到carousel
中的視圖中繼承來(lái)的。你也可以使用carouselItemWidth:
代理方法重寫這個(gè)值,這個(gè)方法會(huì)改變分配給carousel items的空間(但是不會(huì)對(duì)這些item views重寫設(shè)置大小或規(guī)模)。-
(UIView *) contentView
包含carousel item views
的視圖。你可以增加子視圖如果你想用這些carousel items
散置這些視圖。如果你想讓一個(gè)視圖出現(xiàn)在所有carouselitems
的前邊或者后邊,你應(yīng)該直接添加它到iCarousel view
本身來(lái)替代。注意:在
contentView
中視圖的順序是受當(dāng)app執(zhí)行時(shí)的頻率和未標(biāo)注的變化決定的。任何添加到contentView
中的視圖應(yīng)該將他們的userInteractionEnabled
屬性設(shè)置為NO
,來(lái)防止和iCarousel
的觸摸時(shí)間處理放生沖突。 (CGFloat) toggle
這個(gè)屬性用于iCarouselTypeCoverFlow2
的carousel
變換。它是被暴露的以便于你可以使用carousel:itemTransformForOffset:baseTransform:
代理方法實(shí)現(xiàn)自己的CoverFlow2樣式變量。(BOOL) stopAtItemBoundary
默認(rèn)情況下,carousel
被輕擊時(shí)會(huì)停在一個(gè)準(zhǔn)確的item
邊界。如果你設(shè)置這個(gè)值為no
,他會(huì)自然停止,如果scrollToItemBoundary
被設(shè)置為yes
會(huì)滾回或者向前滾動(dòng)到最接近的邊界。(BOOL) scrollToItemBoundary
默認(rèn)情況下,不管carousel
何時(shí)停止移動(dòng),他會(huì)自動(dòng)滾動(dòng)到最近的item
邊界。如果你設(shè)置這個(gè)屬性為no
,carousel
停止后將不會(huì)滾動(dòng)且不管在哪兒他都會(huì)停下來(lái),即使它不是正好對(duì)準(zhǔn)當(dāng)前的索引。有一個(gè)特例是如果打包效果被禁止且bounces
被設(shè)置為yes
,當(dāng)它停下來(lái)時(shí)超出了carousel
的底部,carousel
會(huì)自動(dòng)滾回第一個(gè)或者最后一個(gè)索引 。(BOOL) ignorePerpendicularSwipes
如果為yes
,carousel
將會(huì)忽略垂直于carousel
方向的切換手勢(shì)。目前,一個(gè)水平的carousel
,垂直切換將不會(huì)被攔截。這就意味著你可以獲得一個(gè)在carouselitem view
里垂直滾動(dòng)的scrollView
,它依然會(huì)正確工作。默認(rèn)值為yes
。(BOOL) centerItemWhenSelected
當(dāng)設(shè)置為yes
時(shí),點(diǎn)擊任何在carousel
中的item
而不是那個(gè)匹配currentItemIndex
的視圖,將會(huì)使平滑動(dòng)畫移動(dòng)到居中位置。點(diǎn)擊當(dāng)前被選中的item
將沒(méi)有效果。默認(rèn)值是yes
。-
- (void) scrollByOffset:(CGFloat)offset duration:(NSTimeInterval)duration;
這個(gè)方法作用與scrollByNumberOfItems:
方法一樣,但是允許你滾動(dòng)到一個(gè)微小數(shù)量的items
。如果你想達(dá)到一個(gè)非常準(zhǔn)確的動(dòng)畫效果時(shí)可能有用。注意:如果
scrollToItemBoundary
屬性被設(shè)置為yes
,在你調(diào)用這個(gè)方法后carousel
無(wú)論如何會(huì)自動(dòng)滾動(dòng)到最近一個(gè)item
索引。 -
- (void) scrollToOffset:(CGFloat)offset duration:(NSTimeInterval)duration;
這個(gè)方法工作起來(lái)和scrollToItemAtIndex:
方法一樣,但是允許你移動(dòng)到一個(gè)微小的偏移。如果你想達(dá)到一個(gè)非常準(zhǔn)確的動(dòng)畫效果時(shí)這個(gè)可能有用。注意:如果
scrollToItemBoundary
屬性被設(shè)置為yes
,當(dāng)你調(diào)用這個(gè)方法之后carousel
會(huì)自動(dòng)滾動(dòng)到最近的item
索引。 - (void) scrollByNumberOfItems:(NSInteger)itemCount duration:(NSTimeInterval)duration;
這個(gè)方法允許你使用一個(gè)固定的距離滾動(dòng)carousel
,以carousel
的item
寬度來(lái)衡量。
整數(shù)或負(fù)數(shù)可能由itemCount
來(lái)具體確定,取決于你希望滾動(dòng)的方向。
iCarousel
很好的處理了邊界問(wèn)題,
所以如果你指定了一個(gè)大于carousel
中items
數(shù)量的值,
滾動(dòng)或者在到達(dá)carousel
底部時(shí)被夾緊(如果打包被禁止),或者無(wú)停頓地包裹。- (void) scrollToItemAtIndex:(NSInteger)index duration:(NSTimeInterval)duration;
這個(gè)方法允許你來(lái)控制carousel
使用 多長(zhǎng)時(shí)間來(lái)滾動(dòng)到特定的索引。- (void) scrollToItemAtIndex:(NSInteger)index animated:(BOOL)animated;
這個(gè)方法會(huì)使carousel
居中在一個(gè)特定的item
, 立即或者使用一個(gè)平滑的動(dòng)畫。對(duì)于打包的carousels
,carousel
將會(huì)自動(dòng)決定滾動(dòng)的最短(直線會(huì)或者包著的)距離。如果你需要控制這個(gè)滾動(dòng)的方向,或者想滾動(dòng)多于一個(gè)分辨率,使用scrollByNumberOfItems
這個(gè)方法。-
- (UIView *) itemViewAtIndex:(NSInteger)index;
返回帶有指定索引的可見(jiàn)的item
視圖。注意:這個(gè)索引和
carousel
的位置有關(guān),且不是在visibleItemViews
數(shù)組中的位置,這可能是不一樣的。傳遞一個(gè)賦值或者一個(gè)大于等于numberOfItems
的整數(shù)來(lái)取回占位視圖。這個(gè)方法只有在是可見(jiàn)視圖且情況下才工作,且如果這個(gè)在指定索引處的視圖還沒(méi)被加載時(shí),或者這個(gè)索引超出范圍時(shí),將返回空。 - (NSInteger) indexOfItemView:(UIView *)view;
這個(gè)是carousel
中指定item view
的索引。對(duì)item views
和placeholder views
起作用,但是,placeholder view
索引并不和數(shù)據(jù)源中的索引匹配,且有可能是負(fù)值(查看上面indexesForVisibleItems
屬性介紹的細(xì)節(jié))。這個(gè)方法只對(duì)可見(jiàn)的item views
起作用且對(duì)目前沒(méi)有加載的視圖會(huì)返回NSNotFound
。對(duì)于一列所有加載的視圖,使用visibleItemViews
屬性。- (NSInteger) indexOfItemViewOrSubview:(UIView *)view;
這個(gè)方法給你或者是傳遞的視圖或者是包含有作為參數(shù)的視圖的視圖的item
索引。它通過(guò)以傳遞進(jìn)來(lái)的視圖為開始,向上遍歷視圖層級(jí),直到找到一個(gè)itemview
并返回他在carousel
中的索引。如果沒(méi)有找到當(dāng)前加載的item view
,它會(huì)返回NSNotFound
。這個(gè)方法對(duì)處理一個(gè)item view
內(nèi)嵌的事件控制極其有用。它允許你綁定你的在控制器中控制單一行為方法的item
,且會(huì)找出控制觸發(fā)相關(guān)行為的item
。詳見(jiàn)Controls Demo example
。- (CGFloat) offsetForItemAtIndex:(NSInteger)index;
返回以itemWidth
整數(shù)倍來(lái)記的指定的item
索引處的偏移量。這是用于計(jì)算視圖變換和alpha
的相同值,可以用于根據(jù)carousel
的位置自定義項(xiàng)目視圖。每當(dāng)調(diào)用carouselDidScroll:delegate
方法時(shí),這個(gè)值都可以改變。- (UIView *) itemViewAtPoint:(CGPoint)point;
-
- (void) removeItemAtIndex:(NSInteger)index animated:(BOOL)animated;
這會(huì)從carousel
移除一個(gè)item
,剩下的項(xiàng)目將滑過(guò)來(lái)填補(bǔ)空位。注意:當(dāng)該方法被指定時(shí),數(shù)據(jù)源不會(huì)自動(dòng)更新,因此后續(xù)調(diào)用reloadData將恢復(fù)已刪除的項(xiàng)目。
- (void) insertItemAtIndex:(NSInteger)index animated:(BOOL)animated;
這將一個(gè)item
插入carousel
。 新的item
將從數(shù)據(jù)源中請(qǐng)求,因此,在調(diào)用此方法之前,請(qǐng)確保已將新項(xiàng)目添加到數(shù)據(jù)源數(shù)據(jù),否則在carousel
中item
復(fù)用或其他問(wèn)題。- (void) reloadItemAtIndex:(NSInteger)index animated:(BOOL)animated;
此方法將重新加載指定的item
。 新item
將從數(shù)據(jù)源請(qǐng)求。 如果animated
參數(shù)為YES
,則會(huì)從舊到新的item
視圖交叉淡化,否則會(huì)立即交換。- (void) reloadData;
這個(gè)方法重新從數(shù)據(jù)源加載carousel
視圖并刷新carousel
的顯示。
iCarouselDataSource 代理方法
-
- (NSInteger) numberOfItemsInCarousel:(iCarousel *)carousel;
返回carousel
中界面的數(shù)量 -
- (UIView *) carousel:(iCarousel *)carousel viewForItemAtIndex:(NSInteger)index reusingView:(UIView *)view;
返回一個(gè)在carousel
中要在指定索引處顯示的視圖,reusingView
參數(shù)的作用就像UIPickerView
,之前在carousel
中展示過(guò)的界面被傳遞到方法中來(lái)循環(huán)使用。如果這個(gè)參數(shù)不是空,你可以設(shè)置它的屬性并返回它而不是創(chuàng)建一個(gè)新的視圖實(shí)例,這樣可以稍改善性能。與UITableView
不同,這里沒(méi)有重用id
來(lái)區(qū)分不同的carousel
界面類型。所以如果你的carousel
包含多個(gè)不同的視圖類型,那么每次這個(gè)方法被調(diào)用的時(shí)候,你應(yīng)該只是忽略這個(gè)參數(shù)并返回一個(gè)新的視圖。你應(yīng)該確認(rèn)carousel:viewForItemAtIndex:reusingView:
方法每次被調(diào)用時(shí),它要么返回重用的視圖,要么返回一個(gè)新的視圖實(shí)例而不是保留你自己的循環(huán)視圖池,因?yàn)椴煌?code>carousel界面索引返回多個(gè)相同視圖的復(fù)制品可能造成顯示問(wèn)題。 -
- (NSInteger) numberOfPlaceholdersInCarousel:(iCarousel *)carousel;
返回在carousel
中展示的占位視圖。占位視圖用來(lái)當(dāng)carousel
中界面太少而不能填滿carousel
的寬度,并且你希望在空白的地方顯示一些東西時(shí)使用。它們隨著carousel
移動(dòng)并且像其他carousel
界面一樣運(yùn)行,但是它們不占numberOfItems
數(shù)量,且不能被設(shè)置為當(dāng)前選中的界面。當(dāng)打包屬性被使能時(shí)占位視圖被隱藏。占位視圖或者顯示在carousel
界面的任何一方。對(duì)于n個(gè)占位視圖,前n/2
個(gè)界面將會(huì)出現(xiàn)在界面視圖的左邊,下一個(gè)n/2
個(gè)界面會(huì)出現(xiàn)在右邊。你可以有奇數(shù)個(gè)占位視圖,這種情況下carousel
會(huì)是不對(duì)稱的。 -
- (UIView *) carousel:(iCarousel *)carousel placeholderViewAtIndex:(NSInteger)index reusingView:(UIView *)view;
返回一個(gè)視圖作為占位符視圖。 工作方式與carousel:viewForItemAtIndex:reusingView:
相同。reusingView
的占位視圖存儲(chǔ)在單獨(dú)的池中,用于常規(guī)輪播的重用視圖,因此如果您的占位符視圖與項(xiàng)目視圖不同,則不會(huì)出現(xiàn)問(wèn)題。
iCarouselDelegate 代理方法
-
- (void) carouselWillBeginScrollingAnimation:(iCarousel *)carousel;
只要carousel
開始動(dòng)畫,就會(huì)調(diào)用此方法。在用戶滾動(dòng)carousel
后,可以編程或自動(dòng)觸發(fā),因?yàn)檩啿ブ匦聦?duì)齊本身。 -
- (void) carouselDidEndScrollingAnimation:(iCarousel *)carousel;
當(dāng)carousel
結(jié)束動(dòng)畫時(shí),會(huì)調(diào)用此方法 -
- (void) carouselDidScroll:(iCarousel *)carousel;
無(wú)論何時(shí)滾動(dòng)都會(huì)調(diào)用此方法。無(wú)論輪播是以編程方式滾動(dòng)還是通過(guò)用戶交互來(lái)調(diào)用它。 -
- (void) carouselCurrentItemIndexDidChange:(iCarousel *)carousel;
當(dāng)carousel
滾動(dòng)導(dǎo)致currentItemIndex
屬性更改足夠大時(shí),就會(huì)調(diào)用此方法。無(wú)論item
的index
是按程序更新還是通過(guò)用戶交互來(lái)調(diào)用。 -
- (void) carouselWillBeginDragging:(iCarousel *)carousel;
當(dāng)用戶開始拖動(dòng)carousel
,會(huì)調(diào)用此方法。如果用戶點(diǎn)擊carousel
,或者如果carousel
以編程式滑動(dòng),則不會(huì)觸發(fā)。 -
- (void) carouselDidEndDragging:(iCarousel *)carousel willDecelerate:(BOOL)decelerate;
當(dāng)用戶停止拖動(dòng)carousel
時(shí),會(huì)調(diào)用此方法。
willDecelerate
參數(shù)指示carousel
是否足夠快地行進(jìn),以便在停止之前需要減速(即當(dāng)前的索引不一定是它將停止的),或者它將停止在哪里。注意:即使
willDecelerate
為NO
時(shí)輪播仍將自動(dòng)滾動(dòng),直到它完全對(duì)準(zhǔn)當(dāng)前索引。 如果您需要知道何時(shí)完全停止移動(dòng),請(qǐng)使用carouselDidEndScrollingAnimation
委托方法。 -
- (void) carouselWillBeginDecelerating:(iCarousel *)carousel;
當(dāng)carousel完成減速時(shí),會(huì)調(diào)用此方法,您可以理解為此時(shí)的currentItemIndex
是最終的停止值。 與以前的版本不同,在大多數(shù)情況下,carousel現(xiàn)在將停止在最終的索引位置。 唯一的例外是啟用彈跳的非包裝carousel,其中,如果最終停止位置超出carousel的終點(diǎn),則carousel將自動(dòng)滾動(dòng),直到其完全對(duì)準(zhǔn)結(jié)束索引。為了向后兼容,carousel將始終調(diào)用scrollToItemAtIndex:animated:
在完成減速后。如果您需要知道carousel全停止移動(dòng)的時(shí)間,請(qǐng)使用carouselDidEndScrollingAnimation
委托方法。 -
- (BOOL) carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index;
如果用戶點(diǎn)擊任何輪播項(xiàng)目視圖(不包括占位符視圖),包括當(dāng)前選定的視圖,此方法將觸發(fā)。 方法的目的是忽略旋轉(zhuǎn)木馬上的輕拍(tap
)事件。 如果返回YES
或不實(shí)現(xiàn),則tap
將按照正常的方式進(jìn)行處理,而轉(zhuǎn)盤didSelectItemAtIndex:
方法將被調(diào)用。 如果返回NO
,輪播將忽略輕拍(tap
)事件,它將繼續(xù)傳播到下一視圖層級(jí)。這是防止carousel終止由另一種視圖進(jìn)行處理的輕拍(tap
)事件的方法。 -
- (void) carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;
如果用戶點(diǎn)擊任何輪播項(xiàng)目視圖(不包括占位符視圖),包括當(dāng)前選定的視圖,此方法將觸發(fā)。 如果用戶點(diǎn)擊當(dāng)前所選視圖中的控件(即作為UIControl
的子類的任何視圖),此方法將不會(huì)觸發(fā)。 -
- (CGFloat) carouselItemWidth:(iCarousel *)carousel;
返回carousel中每個(gè)項(xiàng)目的寬度,即每個(gè)item
的間距。如果方法未實(shí)現(xiàn),則默認(rèn)為由carousel返回的第一個(gè)item的寬度:viewForItemAtIndex:reusingView:
的dataSource方法。 如果從carousel返回的視圖:viewForItemAtIndex:reusingView:
不正確(例如,如果視圖的大小不同,或者在其背景圖像中包含影響其影子的陰影或外部陰影,則此方法僅應(yīng)用于裁剪或填充項(xiàng)目視圖size
)。如果你只想放大視圖,那么最好使用iCarouselOptionSpacing
值。 -
- (CATransform3D) carousel:(iCarousel *)carousel itemTransformForOffset:(CGFloat)offset baseTransform:(CATransform3D)transform;
此方法可用于為每個(gè)carousel視圖提供自定義變換。offset
是視圖與傳送帶中間的距離。當(dāng)前中心的item視圖的offset
為0.0
,右邊的offset
為1.0
,左側(cè)的offset
為-1.0
,依此類推。為了實(shí)現(xiàn)線性輪播樣式,因此,您只需將offse
t乘以項(xiàng)寬,并將其用作變換的x
值即可。僅當(dāng)輪播類型為iCarouselTypeCustom
時(shí),才會(huì)調(diào)用此方法。 -
- (CGFloat) carousel:(iCarousel *)carousel valueForOption:(iCarouselOption)option withDefault:(CGFloat)value;
此方法用于定制標(biāo)準(zhǔn)carousel的參數(shù)類型。 通過(guò)實(shí)現(xiàn)這種方法,您可以調(diào)整選項(xiàng),例如圓形轉(zhuǎn)盤中顯示的項(xiàng)目數(shù)量或封面流轉(zhuǎn)盤中的傾斜量,以及轉(zhuǎn)盤是否換行,以及是否應(yīng)在最終淡出等。 對(duì)于任何選項(xiàng),您對(duì)調(diào)整不感滿意,只需返回默認(rèn)值即可。 這些選項(xiàng)的含義列在下面的iCarouselOption
值下。 在Options Demo中查看該方法的高級(jí)用法。 -
- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index;
如果用戶點(diǎn)擊任何carousel item視圖(不包括占位符視圖),包括當(dāng)前選定的視圖,則將觸發(fā)此方法。 如果用戶在當(dāng)前選定的視圖(即,作為UIControl的子類的任何視圖)中點(diǎn)擊控件,該方法將不會(huì)觸發(fā)。 -
- (BOOL)carousel:(iCarousel *)carousel shouldSelectItemAtIndex:(NSInteger)index;
如果用戶點(diǎn)擊任何carousel item視圖(不包括占位符視圖),包括當(dāng)前選定的視圖,則將觸發(fā)此方法。 此方法的目的是使您有機(jī)會(huì)忽略carousel上的點(diǎn)擊。 如果從該方法返回YES或未實(shí)現(xiàn),則將按常規(guī)處理點(diǎn)擊事件并調(diào)用carousel:didSelectItemAtIndex:
方法。 如果返回NO,carousel將忽略點(diǎn)擊事件,它將繼續(xù)沿視圖層次結(jié)構(gòu)傳播。 這是防止carousel攔截其他視圖要處理的點(diǎn)擊事件的好方法。