亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS 頁面滑動與標題切換顏色漸變的聯動效果實例

2020-07-26 02:51:43
字體:
來源:轉載
供稿:網友

話不多說,直接上圖,要實現類似如下效果。

這個效果非常常見,這里著重講講核心代碼

封裝頂部的PageTitleView

封裝構造函數

封裝構造函數,讓別人在創建對象時,就傳入其實需要顯示的內容 frame:創建對象時確定了

  1. frame就可以直接設置子控件的位置和尺寸
  2. isScrollEnable:是否可以滾動。某些地方該控件是可以滾動的。
  3. titles:顯示的所有標題
// MARK:- 構造函數init(frame: CGRect, isScrollEnable : Bool, titles : [String]) {selfisScrollEnable = isScrollEnableselftitles = titlessuperinit(frame: frame)}

設置UI界面

設置UI界面

  1.  添加UIScrollView,如果標題過多,則可以滾動
  2. 初始化所有的Label,用于顯示標題。并且給label添加監聽手勢
  3. 添加頂部線和滑塊的View

實現相對來說比較簡單,這里代碼從略

封裝底部的PageCotentView

封裝構造函數

封裝構造函數,讓別人在創建對象時,就傳入其實需要顯示的內容

  1. 所有用于顯示在UICollectionView的Cell的所有控制器
  2. 控制器的父控制器
// MARK:- 構造函數init(frame: CGRect, childVcs : [UIViewController], parentViewController : UIViewController) {selfchildVcs = childVcsselfparentViewController = parentViewControllersuperinit(frame: frame)}

設置UI界面內容

設置UI界面

  1. 將所有的子控制器添加到父控制器中
  2. 添加UICollectionView,用于展示內容
// MARK:- 懶加載屬性private lazy var collectionView : UICollectionView = {// 1.創建布局let layout = UICollectionViewFlowLayout()layout.itemSize = self.bounds.sizelayout.minimumLineSpacing = 0layout.minimumInteritemSpacing = 0layout.scrollDirection = .Horizontal// 2.創建collectionViewlet collectionView = UICollectionView(frame: self.bounds, collectionViewLayout: layout)collectionView.showsHorizontalScrollIndicator = falsecollectionView.pagingEnabled = truecollectionView.bounces = falsecollectionView.scrollsToTop = falsecollectionView.dataSource = selfcollectionView.delegate = selfcollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: kContentCellID)return collectionView}()private func setupUI() {// 1.添加所有的控制器for childVc in childVcs {parentViewController?.addChildViewController(childVc)}// 2.添加collectionViewaddSubview(collectionView)}

實現UICollectionView的數據源方法

  1. 在返回Cell的方法中,先將cell的contentView中的子控件都移除,防止循環引用
  2. 取出indexPath.item對應的控制器,將控制器的View添加到Cell的contentView中
// MARK:- 遵守UICollectionView的數據源extension PageContentView : UICollectionViewDataSource {func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {return childVcs.count}func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {let cell = collectionView.dequeueReusableCellWithReuseIdentifier(kContentCellID, forIndexPath: indexPath)// 移除之前的for subview in cell.contentView.subviews {subview.removeFromSuperview()}// 取出控制器let childVc = childVcs[indexPath.item]childVc.view.frame = cell.contentView.boundscell.contentView.addSubview(childVc.view)return cell}}

PageTitleView點擊改變PageContentView

通過代理將PageTitleView的事件傳遞出去

/// 定義協議protocol PageTitleViewDelegate : class {func pageTitleView(pageTitleView : PageTitleView, didSelectedIndex index : Int)}@objc private func titleLabelClick(tapGes : UITapGestureRecognizer) {// 1.獲取點擊的下標志guard let view = tapGes.view else { return }let index = view.tag// 2.滾到正確的位置scrollToIndex(index)// 3.通知代理delegate?.pageTitleView(self, didSelectedIndex: index)}

內部調整

// 內容滾動private func scrollToIndex(index : Int) {// 1.獲取最新的label和之前的labellet newLabel = titleLabels[index]let oldLabel = titleLabels[currentIndex]// 2.設置label的顏色newLabel.textColor = kSelectTitleColoroldLabel.textColor = kNormalTitleColor// 3.scrollLine滾到正確的位置let scrollLineEndX = scrollLine.frame.width * CGFloat(index)UIView.animateWithDuration(0.15) {self.scrollLine.frame.origin.x = scrollLineEndX}// 4.記錄indexcurrentIndex = index}

在PageContentView中設置當前應該滾動的位置

// MARK:- 對外暴露方法extension PageContentView { func scrollToIndex(index : Int) {let offset = CGPoint(x: CGFloat(index) * collectionViewboundswidth, y: 0) collectionViewsetContentOffset(offset, animated: false)}}

PageContentView滾動調整PageTitleView

通過觀察,我們發現:

                1> 原來位置的Title顏色會逐漸變暗

                2> 目標位置的Title顏色會逐漸變亮

                3> 變化程度是和滾動的多少相關

由此得出結論:

我們一共需要獲取三個值

1> 起始位置下標值

2> 目標位置下標值

3> 當前滾動的進度

其實前2點可以由第3點計算而來,可以只需要將進度傳遞出去。

根據進度值處理標題顏色漸變及滑塊邏輯

         。當前進度值唯一確定了標題的狀態,計算出需要發生顏色變化的兩相鄰標題索引

         。注意:下標值需要防止越界問題,臨界點的處理

實現代碼

extension PageContentView : UICollectionViewDelegate {func scrollViewWillBeginDragging(scrollView: UIScrollView) {startOffsetX = scrollView.contentOffset.x}func scrollViewDidScroll(scrollView: UIScrollView) {// 0.判斷是否是點擊事件 if isForbidScrollDelegate { return }// 1.定義獲取需要的數據 var progress : CGFloat = 0 let currentOffsetX = scrollView.contentOffset.x let scrollViewW = scrollView.bounds.width  // 1.計算progress  progress = currentOffsetX / scrollViewW  // 3.將progress傳遞給titleView delegate?.pageContentView(self, progress: progress) }}

根據滾動傳入的值,調整PageTitleView

兩種顏色必須使用RGB值設置(方便通過RGB實現漸變效果)

private let kNormalRGB : (CGFloat, CGFloat, CGFloat) = (85, 85, 85)private let kSelectRGB : (CGFloat, CGFloat, CGFloat) = (255, 128, 0)private let kDeltaRGB = (kSelectRGB.0 - kNormalRGB.0, kSelectRGB.1 - kNormalRGB.1, kSelectRGB.2 - kNormalRGB.2)private let kNormalTitleColor = UIColor(red: 85/255.0, green: 85/255.0, blue: 85/255.0, alpha: 1.0)private let kSelectTitleColor = UIColor(red: 255.0/255.0, green: 128/255.0, blue: 0/255.0, alpha: 1.0)

調整scrollLine及兩個Label顏色漸變

// MARK:- 對外暴露方法extension PageTitleView func changeLabel(progress: CGFloat) {// 開啟彈簧效果時的過濾處理 var progress = progress > 0 ? progress : 0  progress = progress <= CGFloat(titleLabels.count - 1) ? progress : CGFloat(titleLabels.count - 1) var leftLabelIndex = Int(floor(progress)) let ratio = progress - CGFloat(leftLabelIndex) //獲取leftLabel和rightLabel let leftLabel = titleLabels[leftLabelIndex] if leftLabelIndex >= 3{  leftLabelIndex = 3 } print("leftLabelIndex = /(leftLabelIndex)") var rightIndex = leftLabelIndex + 1 if rightIndex >= 3{  rightIndex = 3 } print("rightIndex = /(rightIndex)") let rightLabel = titleLabels[rightIndex] //滑塊的邏輯 let moveTotalX = leftLabel.frame.width let moveX = moveTotalX * ratio scrollLine.frame.origin.x = leftLabel.frame.origin.x + moveX //3.Label顏色的漸變 // 3.1.取出變化的范圍 let colorDelta = (kSelectedColor.0 - kNormalColor.0, kSelectedColor.1 - kNormalColor.1, kSelectedColor.2 - kNormalColor.2) if leftLabelIndex != rightIndex { // 3.2.變化leftLabel leftLabel.textColor = UIColor(r: kSelectedColor.0 - colorDelta.0 * ratio, g: kSelectedColor.1 - colorDelta.1 * ratio, b: kSelectedColor.2 - colorDelta.2 * ratio) // 3.2.變化rightLabel rightLabel.textColor = UIColor(r: kNormalColor.0 + colorDelta.0 * ratio, g: kNormalColor.1 + colorDelta.1 * ratio, b: kNormalColor.2 + colorDelta.2 * ratio) } // 4.記錄最新的index currentIndex = leftLabelIndex }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品小说在线| 日本一区二区不卡| 另类少妇人与禽zozz0性伦| 国产精品男女猛烈高潮激情| 国产主播欧美精品| 欧美大人香蕉在线| 永久免费看mv网站入口亚洲| www.亚洲男人天堂| 在线视频欧美日韩| 色婷婷亚洲mv天堂mv在影片| 国产性猛交xxxx免费看久久| 国产精品免费视频久久久| 91精品久久久久久久久久入口| 久久国产精品免费视频| 国产精品男女猛烈高潮激情| 欧美日韩精品在线| 国内精久久久久久久久久人| 美女国内精品自产拍在线播放| 欧美大成色www永久网站婷| 日韩av影视综合网| 欧美激情第1页| 中文字幕亚洲第一| 亚洲一区二区在线| 91九色国产在线| 久久天天躁狠狠躁夜夜av| 蜜臀久久99精品久久久久久宅男| 精品magnet| 丁香五六月婷婷久久激情| 国模精品视频一区二区| 日韩三级成人av网| 国产精品久久久久久婷婷天堂| 欧美xxxx18国产| 国产91精品高潮白浆喷水| 在线一区二区日韩| 欧美视频中文字幕在线| 91在线国产电影| 国产一区二区精品丝袜| 国产91在线视频| 狠狠久久五月精品中文字幕| 欧美午夜性色大片在线观看| 国产v综合v亚洲欧美久久| 久久久久久国产精品| 尤物九九久久国产精品的特点| 精品国产欧美一区二区三区成人| 亚洲欧洲国产伦综合| 国产精品日日做人人爱| 性夜试看影院91社区| 亚洲片国产一区一级在线观看| 国产精品亚洲美女av网站| 日韩av综合网站| 在线一区二区日韩| 国产精品久久久久久久久男| 欧美自拍视频在线观看| 97免费视频在线播放| 不卡中文字幕av| 操91在线视频| 精品国产福利视频| 欧美日韩国产精品专区| 国产综合香蕉五月婷在线| 亚洲白拍色综合图区| 亚洲黄色成人网| 日韩av电影手机在线观看| 亚洲香蕉av在线一区二区三区| 日日骚av一区| 色偷偷噜噜噜亚洲男人的天堂| 亚洲四色影视在线观看| 欧美国产日韩精品| 一区二区三区无码高清视频| 成人免费激情视频| 亚洲色图美腿丝袜| 国产综合香蕉五月婷在线| 成人xvideos免费视频| 亚洲石原莉奈一区二区在线观看| 亚洲欧美国产精品va在线观看| 欧美高清电影在线看| 久久精品成人欧美大片| 欧美激情视频在线免费观看 欧美视频免费一| 亚洲国产成人在线视频| 91最新在线免费观看| 国产精品美女呻吟| 9.1国产丝袜在线观看| 91国内揄拍国内精品对白| 国产精品主播视频| 国模私拍一区二区三区| 亚洲综合视频1区| 久久精品影视伊人网| 国产精品久久久久免费a∨| 精品毛片三在线观看| 中文字幕成人精品久久不卡| 久久影视电视剧免费网站| 日韩最新av在线| 亚洲片在线资源| 性欧美激情精品| 亚洲综合视频1区| 91国内免费在线视频| 国产精品高清网站| 欧美情侣性视频| 亚洲最大福利视频网站| 国产精品自拍偷拍| 懂色av中文一区二区三区天美| 91中文字幕在线观看| 高清亚洲成在人网站天堂| 欧美夫妻性视频| 亚洲人成电影网站色xx| 91免费人成网站在线观看18| 国产在线精品一区免费香蕉| 欧美日韩福利在线观看| 久久综合九色九九| 亚洲自拍欧美另类| 91久久精品日日躁夜夜躁国产| 欧美在线视频观看免费网站| 久久久精品国产亚洲| 成人欧美一区二区三区黑人孕妇| 精品国产欧美一区二区三区成人| 久久91精品国产91久久久| 亚洲欧美日韩第一区| 中文在线资源观看视频网站免费不卡| 亚洲永久免费观看| 色诱女教师一区二区三区| 国产啪精品视频网站| 欧美激情久久久久| 国产精品成人免费电影| 欧美精品一二区| 色偷偷噜噜噜亚洲男人的天堂| 国产日韩精品综合网站| 久久久亚洲影院你懂的| 国产日韩欧美电影在线观看| 26uuu另类亚洲欧美日本老年| 日韩精品视频观看| 91视频国产一区| 在线播放国产一区二区三区| 国产成人激情小视频| 日韩三级成人av网| 91精品在线观| 欧美日韩成人在线观看| 久久精品成人欧美大片| 亚洲欧美日韩综合| 久久久在线视频| 国产精品影院在线观看| 久久久久久香蕉网| 精品久久久久久久久久久| 亚洲欧美国产精品专区久久| 成人免费高清完整版在线观看| 中文字幕久热精品在线视频| 国产一区二区三区在线| 亚洲精品理论电影| 91黑丝高跟在线| 中文在线资源观看视频网站免费不卡| 亚洲美腿欧美激情另类| 亚洲综合小说区| 欧美黑人巨大精品一区二区| 亚洲最新av在线网站| 少妇高潮久久久久久潘金莲| 欧美日本高清一区| 人人做人人澡人人爽欧美| 成人免费看片视频| 日韩在线免费视频观看| 国产成人亚洲综合91| 5566日本婷婷色中文字幕97| 亚洲成年人影院在线| 亚洲国产美女久久久久| 日本久久亚洲电影| 久久久久在线观看| 国产精品av在线|