Git: https://github.com/DrunkenMouse/clickCutViewAndContainScrollViewClickAndCutView
效果圖:?

通過(guò)點(diǎn)擊切換頁(yè)面功能,其實(shí)就是通過(guò)點(diǎn)擊事件切換不同的View。是不是覺(jué)得有點(diǎn)廢話?然而不管是本Demo中用到的外層按鈕點(diǎn)擊切換View,還是子View中通過(guò)scrollView掛載的Label點(diǎn)擊切換View、蘋果提供的segmented點(diǎn)擊切換View都是同樣的方法。
那么沒(méi)有點(diǎn)擊事件怎么辦?就好比Label一樣,沒(méi)有點(diǎn)擊觸發(fā)事件怎么辦?那就自己添加手勢(shì)。本Demo就是通過(guò)給Label添加手勢(shì)完成的點(diǎn)擊事件。
外層的View是通過(guò)創(chuàng)建新的ViewController,將其加到自身的子ViewController,通過(guò)按鈕的點(diǎn)擊事件切換不同的ViewController.View,切換前移除舊的View,添加新的View。
FirstViewController *discountVc=[[FirstViewController alloc]init];
[self addChildViewController:discountVc];UIViewController *oldVc = self.childViewControllers[from%3];
[oldVc.view removeFromSuperview];
UIViewController *newVc = self.childViewControllers[to%3];
newVc.view.frame = CGRectMake(0,64+49, W, H-64-49);
[self.view addSubview:newVc.view];
這有個(gè)很大的弊端:子頁(yè)面的添加。
如果要添加很多個(gè)子頁(yè)面,就要?jiǎng)?chuàng)建很多個(gè)子ViewController,這就很麻煩了。所以scrollView的點(diǎn)擊切換界面我用的是CollectionView。
CollectionView的Cell設(shè)置為我們需要展示的View寬高,間距為0.不同的View展示不同的內(nèi)容,scrollView點(diǎn)擊時(shí)只要滾動(dòng)當(dāng)前CollectionView即可,甚至其自帶Cell的重用機(jī)制,可以自動(dòng)幫我們節(jié)省內(nèi)存。
而Cell切換時(shí),如何讓當(dāng)前欄目居中那?只要計(jì)算下如果當(dāng)前scrollView掛載的Label要居中,應(yīng)該偏移多少X即可。但要注意一點(diǎn),如果不想讓最左邊的Label也跑到中間,或最右邊的Label也跑到中間就需要計(jì)算出兩個(gè)偏移的最小與最大值。
//計(jì)算應(yīng)該滾動(dòng)多少
CGFloat needScrollOffsetX = self.currentSelectedLabel.center.x - self.channelScrollView.bounds.size.width * 0.5;
//最大允許滾動(dòng)的距離
CGFloat maxAllowScrollOffsetX = self.channelScrollView.contentSize.width - self.channelScrollView.bounds.size.width;
//最小就是0
而關(guān)于底部紅色標(biāo)簽它就是一個(gè)View,當(dāng)按鈕或Label被點(diǎn)擊時(shí)設(shè)置下其frame即可,如果是想移動(dòng)到當(dāng)前需要到達(dá)的位置,通過(guò)UIView動(dòng)畫即可,就不多說(shuō)了。詳情請(qǐng)看Demo
PS:本想把keep里的視頻播放寫出來(lái)的,但奈何最近正在寫直播跟一些collection的動(dòng)畫效果等,就一直沒(méi)時(shí)間再去寫了,不過(guò)有空了肯定會(huì)去寫的,等寫好了再發(fā)出來(lái)吧。