iOS -swift-模仿今日頭條滾動(dòng)界面(多種使用場(chǎng)景封裝)

前言###

隨著swift3.0推出之后,我們廣大的iOS同胞都慢慢的走向swift開(kāi)發(fā),當(dāng)然小編也不例外,也在靜下心來(lái)了解了解swift,但是單純的這樣看文檔那也不是一個(gè)好辦法,因?yàn)閷?duì)于我來(lái)講,代碼才是最親切的朋友,所以索性就是直接看代碼、寫(xiě)代碼最直接。

代碼下載地址:
swift版本:高仿今日頭條、網(wǎng)易新聞UI結(jié)構(gòu)
OC版本:高仿今日頭條

正文#####

小編琢磨著,在OC中我們經(jīng)常用到一些經(jīng)典的UI結(jié)構(gòu)(都不知道寫(xiě)了多少次了)都是已經(jīng)封裝好的,那么以后在使用swift的時(shí)候,不是也是需要這樣封裝好的UI結(jié)構(gòu)嗎?反正邏輯都是差不多的,只是寫(xiě)的方式改改,下面是多種使用場(chǎng)景的效果圖


高仿今日頭條01.gif

高仿今日頭條02.gif

高仿今日頭條03.gif

實(shí)現(xiàn)可以設(shè)置的功能有:
1、可以標(biāo)題欄是否可以滾動(dòng),注意標(biāo)題都是滾動(dòng)到中心位置

var  pageStyleModel = LZBPageStyleModel()
    pageStyleModel.isScrollEnable = true

調(diào)節(jié)選中的標(biāo)題到中心位置

 //調(diào)整位置
 func adjustTargetOffset(){
    let  targetLabel = self.titleLabels[currentIndex]   //當(dāng)前選中的標(biāo)題的索引
    var  offsetX = targetLabel.center.x - scrollView.bounds.width * 0.5
    if offsetX < 0{
        offsetX = 0
    }
    let  maxOffsetX = self.scrollView.contentSize.width - scrollView.bounds.width
    if offsetX > maxOffsetX{
        offsetX = maxOffsetX
    }
    scrollView.setContentOffset(CGPoint(x: offsetX, y: 0), animated: true)
}

2、可以設(shè)置是否縮放選中標(biāo)題

//4.拖動(dòng)contentView,改變字體大小
    if self.style.isNeedScale {
        let deltaScale = self.style.maxScale - 1.0
        soureLabel.transform = CGAffineTransform(scaleX: self.style.maxScale - deltaScale * progress, y: self.style.maxScale - deltaScale * progress)
        targetLabel.transform =  CGAffineTransform(scaleX: 1.0 + deltaScale * progress, y: 1.0 + deltaScale * progress)
    }

3、可以設(shè)置是否下滑線長(zhǎng)度與文字對(duì)齊

let deltaWidth = targetLabel.frame.width - soureLabel.frame.width
    let deltaX = targetLabel.frame.origin.x - soureLabel.frame.origin.x
    //3.拖動(dòng)contentView,下劃線漸變
    if self.style.isShowBottomLine {
        bottomLine.frame.size.width = soureLabel.frame.width + deltaWidth * progress
        bottomLine.frame.origin.x = soureLabel.frame.origin.x + deltaX * progress
    }

4.可以設(shè)置文字顏色漸變

//2.顏色漸變
    soureLabel.textColor = UIColor(r: (self.selectColor.0 - deltaColor.0) * progress, g: (self.selectColor.1 - deltaColor.1) * progress, b: (self.selectColor.2 - deltaColor.2) * progress)
    targetLabel.textColor = UIColor(r: (self.normalColor.0 + deltaColor.0) * progress, g: (self.normalColor.1 + deltaColor.1) * progress, b: (self.normalColor.2 + deltaColor.2) * progress)

5、可以設(shè)置遮罩漸變

//4.拖動(dòng)contenView,mask漸變
    if self.style.isNeedMask {
        self.lableMaskView.frame.size.width = self.style.isScrollEnable ? soureLabel.frame.width + 2 * self.style.maskInsetMargin + deltaWidth * progress : soureLabel.frame.width + deltaWidth * progress
        self.lableMaskView.frame.origin.x = self.style.isScrollEnable ? soureLabel.frame.origin.x -  self.style.maskInsetMargin + deltaX * progress : soureLabel.frame.origin.x + deltaX * progress
    }

所有可以配置的參數(shù)都可以通過(guò)LZBPageStyleModel配置

var  titleViewHeight : CGFloat = 44  //標(biāo)題欄默認(rèn)高度
 var  titleViewTitleNormalColor : UIColor = UIColor(r: 0, g: 0, b: 0)  //正常情況默認(rèn)黑色
var  titleViewTitleSelectColor : UIColor = UIColor(r: 255, g: 0, b: 7) //選中情況默認(rèn)紅色
var  titleViewTitleFont : UIFont = UIFont.systemFont(ofSize: 14.0)  //默認(rèn)字體
var  isScrollEnable : Bool = false   //默認(rèn)不可以滾動(dòng)
var  titleViewMargin :  CGFloat = 20.0  //默認(rèn)間距
var  isShowBottomLine : Bool = true      //是否顯示底部線
var  bottomLineHeight : CGFloat = 2.0   //底部線的默認(rèn)高度
var  bottomLineColor : UIColor = UIColor.red    //底部線默認(rèn)顏色
var isNeedScale : Bool = false   //是否需要放大
var maxScale : CGFloat = 1.2   //縮放的最大值
var isNeedMask : Bool = false   //是否需要遮罩
var maskColor  : UIColor = UIColor(white: 0.4, alpha: 0.5)  //遮罩顏色
var maskInsetMargin : CGFloat = 10.0  //遮罩內(nèi)部間距
var maskHeight : CGFloat = 25.0  //遮罩高度
var maskLayerRadius : CGFloat = 12.5  //遮罩圓角

封裝UI使用步驟###

1、創(chuàng)建標(biāo)題欄標(biāo)題數(shù)組,注意必須與后面控制器對(duì)應(yīng)

  let titles = ["英雄聯(lián)盟","火藍(lán)","提姆隊(duì)長(zhǎng)","史前巨鱷","洛克薩斯之手","狗頭","武器"]

2、創(chuàng)建控制器數(shù)組,根據(jù)自己項(xiàng)目具體不同而使用不同的控制器
> var childvcs = UIViewController
for i in 0..<titles.count
{
let vc = UIViewController()
let backgroundcolor = UIColor.getRandomColor() //獲取隨機(jī)顏色
vc.view.backgroundColor = backgroundcolor
childvcs.append(vc)
}
3、創(chuàng)建樣式,根據(jù)項(xiàng)目自己配置

var  pageStyleModel = LZBPageStyleModel()
    pageStyleModel.isScrollEnable = true  //是否可以滾動(dòng)
    pageStyleModel.isNeedScale = true  //是否需要放大
    pageStyleModel.isShowBottomLine = false  /是否需要底部線
    pageStyleModel.isNeedMask = true  //是否需要遮罩

4、創(chuàng)建pageView

let pageView = LZBPageView(frame: pageFrame, titles: titles, pageStyle: pageStyleModel, childVcs: childvcs, parentVc: self)
  view.addSubview(pageView)

代碼結(jié)構(gòu)清晰、并且有注釋,集成度高、耦合性低,方便使用

代碼下載地址:
swift版本:高仿今日頭條、網(wǎng)易新聞UI結(jié)構(gòu)
OC版本:高仿今日頭條

最后贈(zèng)言###

如果覺(jué)得文章對(duì)您有幫助,不要忘記star哦!??,star 是對(duì)程序猿最大的鼓勵(lì)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,211評(píng)論 4 61
  • 【31】 安葬了我奶奶,眨眼到了2010年,我爹再不能像以前那樣為所欲為了,因?yàn)閮晌嘧?,六個(gè)人,七八個(gè)心眼兒,他...
    子魚(yú)ziyu閱讀 598評(píng)論 0 1
  • 耶穌基督本有上帝的形象與光輝,反倒虛己,道成肉身,以人子的身份來(lái)到做兒女起步的人當(dāng)中。 聽(tīng),且要聽(tīng)他的教...
    墨姨閱讀 5,366評(píng)論 0 0
  • 文/以恒 ‖ 2017堅(jiān)持簡(jiǎn)書(shū)日更 第199篇 ‖ 轉(zhuǎn)載請(qǐng)聯(lián)系作者授權(quán) 今天最主要的事就是陪我家大胡去市里的醫(yī)科大...
    Amy向前沖閱讀 664評(píng)論 1 1
  • 所有的相遇,都是久別重逢! 感恩我們相遇在這里! 奇跡30第20班開(kāi)始招生,包括新推出的【靈性之美】系列落...
    日光傾城52fhx閱讀 108評(píng)論 0 0

友情鏈接更多精彩內(nèi)容