DDGBannerScrollView (無(wú)限圖片瀏覽器,背景漸變刊头,可定制化page)

寫(xiě)在前面

幾乎每個(gè)app都會(huì)用到圖片輪播器仗颈,而且圖片輪播器也越來(lái)越高大上佛舱,沉浸式等拉高了APP的檔次
,沒(méi)有一個(gè)高大上的圖片輪播器挨决,都不好意思上架请祖。
 像一些知名的app都采用了圖片輪播的背景漸變色,舉幾個(gè)栗子:優(yōu)酷的首頁(yè)凰棉,喜馬拉雅损拢,蜻蜓fm,嗶哩嗶哩漫畫(huà)等撒犀,
 page索引也是玩的很高大上,系統(tǒng)的早已滿足不了了需求掏秩。
 鑒于此和項(xiàng)目的需要或舞,在前人的基礎(chǔ)上,整理了一個(gè)這個(gè)庫(kù)蒙幻,志在簡(jiǎn)單的幾句代碼映凳,就能讓?xiě)?yīng)用看上去高大上。
 github:[DDGBannerScrollView](https://github.com/dudongge/DDGBannerScrollView)

DDGBannerScrollView 此庫(kù)的功能

 1邮破、無(wú)限圖片輪播功能
 2诈豌、每個(gè)圖片的相對(duì)偏移量,方便開(kāi)發(fā)者自己封裝東西
 3抒和、pageControl的幾個(gè)動(dòng)畫(huà)矫渔,(旋轉(zhuǎn),跳躍等慢慢會(huì)增加)
 
 DDGBannerScrollView 用到的知識(shí)
 1摧莽、圖片輪播器(UICollectionView + 定時(shí)器)
 2庙洼、一種顏色向另一種顏色線性的漸變。
 3镊辕、簡(jiǎn)單的旋轉(zhuǎn)動(dòng)畫(huà)(frame動(dòng)畫(huà) CABasicAnimation)
 4油够、簡(jiǎn)單的貝塞爾曲線(半圓)與動(dòng)畫(huà)的組合(UIBezierPath + CAKeyframeAnimation)

來(lái)看看效果(雖然效果不太明顯)

[圖片上傳失敗...(image-cb323d-1548121510551)]

動(dòng)畫(huà)的模塊也可單獨(dú)使用

image

!

模塊分解

圖片輪播器

圖片輪播器(UICollectionView + 定時(shí)器),這個(gè)參考了知名的第三方庫(kù)SDCycleScrollView征懈,并在此基礎(chǔ)上做了修改石咬,文末附有鏈接
所以在性能和穩(wěn)定性上有了保證,在此表示感謝卖哎。

兩種顏色的線性漸變

image

!

我們都知道鬼悠,一個(gè)像素點(diǎn)有三原色加上透明度組成删性,也就是所說(shuō)的RGBA(紅,綠厦章,藍(lán)镇匀,透明度),改變其中的任意一個(gè)值袜啃,給我們呈現(xiàn)的顏色就不一樣汗侵。
比如,一個(gè)點(diǎn)的R1為10群发,另一個(gè)顏色的R2為30晰韵,那么R1->R2的線性變化的差值就是20 ,如果滑塊的偏移量為100,那么漸變系數(shù)為0.2熟妓,那么R2 = 10 + 100 * 0.2雪猪,
當(dāng)我們?cè)诶瑝K的過(guò)程中,R在顏色變化中就是線性的起愈,同理剩余顏色也是漸變的只恨。如上圖中的中間View,就是在兩個(gè)顏色之間過(guò)度抬虽。
這個(gè)關(guān)于顏色的擴(kuò)展官觅,我已經(jīng)封裝到庫(kù)中,大家可以直接使用阐污。
關(guān)鍵函數(shù)為下面休涤,具體實(shí)現(xiàn)可參考代碼
/**
 得到一個(gè)顏色的原始值 RGBA
 
 @param originColor 傳入顏色
 @return 顏色值數(shù)組
 */
+ (NSArray *)getRGBDictionaryByColor:(UIColor *)originColor;

/**
 得到兩個(gè)值的色差
 
 @param beginColor 起始顏色
 @param endColor 終止顏色
 @return 色差數(shù)組
 */
+ (NSArray *)transColorBeginColor:(UIColor *)beginColor andEndColor:(UIColor *)endColor;

/**
 傳入兩個(gè)顏色和系數(shù)
 
 @param beginColor 開(kāi)始顏色
 @param coe 系數(shù)(0->1)
 @param endColor 終止顏色
 @return 過(guò)度顏色
 */
+ (UIColor *)getColorWithColor:(UIColor *)beginColor andCoe:(double)coe  andEndColor:(UIColor *)endColor;

簡(jiǎn)單的旋轉(zhuǎn)動(dòng)畫(huà)和貝塞爾半圓動(dòng)畫(huà)

簡(jiǎn)單的旋轉(zhuǎn)動(dòng)畫(huà)和貝塞爾半圓動(dòng)畫(huà)(比較基礎(chǔ)和簡(jiǎn)單,直接上代碼)
/**
 添加旋轉(zhuǎn)動(dòng)畫(huà)

 @param imageView 旋轉(zhuǎn)的目標(biāo)圖片
 @param duration 旋轉(zhuǎn)持續(xù)時(shí)間
 @param clockwise 旋轉(zhuǎn)的方向(正向還是逆向)
 */
- (void)startrRotationImageView:(UIImageView *)imageView duration:(CGFloat)duration clockwise:(BOOL)clockwise {
    CABasicAnimation* rotationAnimation;
    //動(dòng)畫(huà)的方式笛辟,繞著z軸
    rotationAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
    //旋轉(zhuǎn)的弧度
    rotationAnimation.toValue = [NSNumber numberWithFloat: clockwise ? M_PI * 2.0 : -M_PI * 2.0 ];
    //動(dòng)畫(huà)持續(xù)的時(shí)間
    rotationAnimation.duration = duration;
    //動(dòng)畫(huà)角度值是否累加(默認(rèn)為NO)
    rotationAnimation.cumulative = NO;
    //重復(fù)次數(shù)
    rotationAnimation.repeatCount = 1;
    //動(dòng)畫(huà)添加到layer上
    [imageView.layer addAnimation:rotationAnimation forKey:@"rotationAnimation"];
}

/**
 沿著UIBezierPath運(yùn)動(dòng)

 @param imageView 目標(biāo)b圖片
 @param duration 動(dòng)畫(huà)持續(xù)時(shí)間
 @param controlPoint 控制點(diǎn)
 @param clockwise 旋轉(zhuǎn)方向(正向還是逆向)
 */
- (void)startrRotationImageView:(UIImageView *)imageView duration:(CGFloat)duration controlPoint:(CGPoint)controlPoint clockwise:(BOOL)clockwise {
    CAKeyframeAnimation *animation = [CAKeyframeAnimation animation];
    //設(shè)置動(dòng)畫(huà)屬性功氨,因?yàn)槭茄刂惾麪柷€動(dòng),所以要設(shè)置為position
    animation.keyPath = @"position";
    //設(shè)置動(dòng)畫(huà)時(shí)間
    animation.duration = duration;
    // 告訴在動(dòng)畫(huà)結(jié)束的時(shí)候不要移除
    animation.removedOnCompletion = YES;
    // 始終保持最新的效果
    //animation.fillMode = kCAFillModeForwards;
    //貝塞爾曲線
    UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:controlPoint radius:((_dotMargin + _dotNomalSize.width ) /2.0) startAngle: clockwise ? M_PI : 0 endAngle: clockwise ? 0 : M_PI clockwise: clockwise];
    // 設(shè)置貝塞爾曲線路徑
    animation.path = circlePath.CGPath;
    // 將動(dòng)畫(huà)對(duì)象添加到視圖的layer上
    [imageView.layer addAnimation:animation forKey:@"position"];
}

如何使用

1手幢,下載本demo捷凄,直接將DDGBannerScrollView文件夾下的文件拖入即可,詳細(xì)使用見(jiàn)demo和源碼
2弯菊,pod 'DDGBannerScrollView'

簡(jiǎn)單代碼

//頭部banner圖片
@property (nonatomic, strong) DDGBannerScrollView *bannerScrollView;
//頭部banner背景圖片
@property (nonatomic, strong) UIView *bgHeaderView;
- (UIView *)bgHeaderView {
if (!_bgHeaderView) {
_bgHeaderView = [[UIView alloc]init];
_bgHeaderView.frame = CGRectMake(0,0, screen_width , screen_width * 0.37 + 120);
}
return _bgHeaderView;
}

- (DDGBannerScrollView *)bannerScrollView {
if (!_bannerScrollView) {
CGRect frame = CGRectMake(30, 88, self.view.frame.size.width - 60, screen_width * 0.37);
_bannerScrollView = [DDGBannerScrollView cycleScrollViewWithFrame:frame delegate:self placeholderImage:[UIImage imageNamed:@"cache_cancel_all"]];
_bannerScrollView.imageURLStringsGroup = @[@"3",@"1",@"2",@"1",@"3"];
}
return _bannerScrollView;
}

[self.bgHeaderView addSubview:self.bannerScrollView];
self.bannerScrollView.pageControlAliment = DDGBannerScrollViewPageContolAlimentRight;
self.bannerScrollView.pageControlStyle = DDGBannerScrollViewPageControlHorizontal;
self.bannerScrollView.pageDotColor = UIColor.greenColor;
self.bannerScrollView.currentPageDotColor = UIColor.redColor;

//根據(jù)偏移量計(jì)算設(shè)置banner背景顏色
- (void)handelBannerBgColorWithOffset:(NSInteger )offset {
if (1 == self.changeColors.count) return;
NSInteger offsetCurrent = offset % (int)self.bannerScrollView.bounds.size.width ;
float rate = offsetCurrent / self.bannerScrollView.bounds.size.width ;
NSInteger currentPage = offset / (int)self.bannerScrollView.bounds.size.width;
UIColor *startPageColor;
UIColor *endPageColor;
if (currentPage == self.changeColors.count - 1) {
startPageColor = self.changeColors[currentPage];
endPageColor = self.changeColors[0];
} else {
if (currentPage  == self.changeColors.count) {
return;
}
startPageColor = self.changeColors[currentPage];
endPageColor = self.changeColors[currentPage + 1];
}
UIColor *currentToLastColor = [UIColor getColorWithColor:startPageColor andCoe:rate andEndColor:endPageColor];
self.bgHeaderView.backgroundColor = currentToLastColor;
}

寫(xiě)在最后

奉上github地址:DDGBannerScrollView

掘金地址:DDGBannerScrollView

簡(jiǎn)書(shū)地址:DDGBannerScrollView

最后纵势,再次感謝下SDCycleScrollView的作者,也感謝大家的關(guān)心和支持管钳,如果對(duì)你有幫助钦铁,希望你不吝?star一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末才漆,一起剝皮案震驚了整個(gè)濱河市牛曹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌醇滥,老刑警劉巖黎比,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件超营,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阅虫,警方通過(guò)查閱死者的電腦和手機(jī)演闭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颓帝,“玉大人米碰,你說(shuō)我怎么就攤上這事」撼牵” “怎么了吕座?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瘪板。 經(jīng)常有香客問(wèn)我吴趴,道長(zhǎng),這世上最難降的妖魔是什么侮攀? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任锣枝,我火速辦了婚禮,結(jié)果婚禮上兰英,老公的妹妹穿的比我還像新娘惊橱。我一直安慰自己,他們只是感情好箭昵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著回季,像睡著了一般家制。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泡一,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天颤殴,我揣著相機(jī)與錄音,去河邊找鬼鼻忠。 笑死涵但,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的帖蔓。 我是一名探鬼主播矮瘟,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼塑娇!你這毒婦竟也來(lái)了澈侠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤埋酬,失蹤者是張志新(化名)和其女友劉穎哨啃,沒(méi)想到半個(gè)月后烧栋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拳球,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年审姓,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片祝峻。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魔吐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呼猪,到底是詐尸還是另有隱情画畅,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布宋距,位于F島的核電站轴踱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谚赎。R本人自食惡果不足惜淫僻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壶唤。 院中可真熱鬧雳灵,春花似錦、人聲如沸闸盔。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)迎吵。三九已至躲撰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間击费,已是汗流浹背拢蛋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蔫巩,地道東北人谆棱。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像圆仔,于是被迫代替她去往敵國(guó)和親垃瞧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)荧缘、插件皆警、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • 移動(dòng)互聯(lián)網(wǎng)行業(yè),雙方拼的是時(shí)間和速度截粗,新上線產(chǎn)品每月甚至更短時(shí)間更新迭代一次信姓,以便打響品牌鸵隧,快速占領(lǐng)市場(chǎng)。小步快跑...
    jason_peng閱讀 1,466評(píng)論 0 14
  • 晚安意推,親愛(ài)的自己豆瘫。 今早起來(lái)心里一陣驚悸,以為又開(kāi)始周一了呢菊值。作息時(shí)間外驱,生活節(jié)奏還是要慢慢地來(lái)進(jìn)行調(diào)整。記住了:今...
    wlmm閱讀 160評(píng)論 0 0
  • 2017年馬上就要接近尾聲腻窒,回頭看過(guò)去昵宇,雖然并未取得大的實(shí)質(zhì)性突破,但總的來(lái)說(shuō)儿子,2017年也是收獲頗多瓦哎,在30歲的...
    生活小計(jì)閱讀 309評(píng)論 2 1
  • 1.. 我從小就是一個(gè)特別有主見(jiàn)的女孩子蒋譬,上哪所大學(xué),選什么專業(yè)愉适,學(xué)什么特長(zhǎng)犯助,爸爸媽媽全都是讓我自己做主…… 以至...
    蠻子姑娘閱讀 498評(píng)論 0 4