Git: https://github.com/DrunkenMouse/clickCutViewAndContainScrollViewClickAndCutView
效果圖:?
通過點(diǎn)擊切換頁面功能噪叙,其實(shí)就是通過點(diǎn)擊事件切換不同的View。是不是覺得有點(diǎn)廢話繁疤?然而不管是本Demo中用到的外層按鈕點(diǎn)擊切換View,還是子View中通過scrollView掛載的Label點(diǎn)擊切換View、蘋果提供的segmented點(diǎn)擊切換View都是同樣的方法稠腊。
那么沒有點(diǎn)擊事件怎么辦躁染?就好比Label一樣,沒有點(diǎn)擊觸發(fā)事件怎么辦架忌?那就自己添加手勢(shì)吞彤。本Demo就是通過給Label添加手勢(shì)完成的點(diǎn)擊事件。
外層的View是通過創(chuàng)建新的ViewController叹放,將其加到自身的子ViewController饰恕,通過按鈕的點(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è)很大的弊端:子頁面的添加井仰。
如果要添加很多個(gè)子頁面埋嵌,就要?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á)的位置,通過UIView動(dòng)畫即可臀稚,就不多說了吝岭。詳情請(qǐng)看Demo
PS:本想把keep里的視頻播放寫出來的,但奈何最近正在寫直播跟一些collection的動(dòng)畫效果等吧寺,就一直沒時(shí)間再去寫了窜管,不過有空了肯定會(huì)去寫的,等寫好了再發(fā)出來吧稚机。