pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例

卡片橫向滑動動畫效果相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關于利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例,文中通過示例代碼介紹的非常詳細,對大家具有一

本文主要給大家介紹了關于利用swift實現(xiàn)卡片橫向滑動動畫效果的相關資料,分享出來供大家參考學習,下面來一起看看詳細的介紹吧。

根據(jù)慣例,首先上效果圖:


那天去面試,面試官突然拿出手機點開了一個app,自個在那點了一會,然后問我 這個效果怎么實現(xiàn),當時一看可以滑動,肯定用scrollView 或者 collectionView實現(xiàn),就大概的說了下。今天剛好閑下來,就敲一敲這個效果。

先來分析下這個效果:

卡片是橫向滾動,并且每個卡片的位置都是保持在屏幕中間的,而且 左右相鄰的卡片都露出來一點邊
collectionView 和scrollView都可以實現(xiàn),在這里,我們用collectionView實現(xiàn),但是我們平常普通用的collectionView都是正屏滑動的!!而且是平滑,所有我們只能自定義UICollectionViewFlowLayout 流式布局,才可以達到上圖效果.

廢話不多說,直接上代碼:

創(chuàng)建collectionView布局


//創(chuàng)建collectionView布局
func setepUI() {
//CustomLayout是自定義的UICollectionViewFlowLayout
 layout = CustomLayout()
 layout?.itemSize = CGSize(width: SCREEN_WIDTH-80, height: SCREEN_HEIGHT-64-120)

 let rect = CGRect(x: 0, y: 64, width:SCREEN_WIDTH , height: SCREEN_HEIGHT-64)
 collectionView = UICollectionView(frame: rect, collectionViewLayout: layout!)
 collectionView?.delegate = self
 collectionView?.dataSource = self
 view.addSubview(collectionView!)
 collectionView?.register(CustomViewCell.self, forCellWithReuseIdentifier: "identifier")
 collectionView?.backgroundColor = UIColor.red

 }

實現(xiàn)代理方法:

我們在extension中實現(xiàn):


// MARK: -- delegate and datasource
extension ViewController:
UICollectionViewDelegate,
UICollectionViewDataSource,
UICollectionViewDelegateFlowLayout{

 func numberOfSections(in collectionView: UICollectionView) -> Int {
 return 1
 }

 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
 return 10
 }
 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
//CustomViewCell是自定義的cell
 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath) as! CustomViewCell
 cell.backgroundColor = UIColor.orange
 cell.lable?.text = "\(indexPath.row)/\(10)"
 return cell
 }
}

至此,我們可以得到普通的效果,左右滑動,但中間cell不會居中,兩側cell也不會縮放,如下圖:


這個時候就需要在自定義的流式布局 CustomLayout里做點什么了:

初始化方法 prepare , 初始化一些內容:


//重寫prepare方法
 //布局之前的準備工作 初始化 這個方法每次layout發(fā)生改變就調用一次
override func prepare() {
  scrollDirection = UICollectionViewScrollDirection.horizontal
   minimumLineSpacing = 20.0
  sectionInset = UIEdgeInsets(top: 0, left: 40, bottom: 0, right: 40)
  super.prepare()
 }

(該方法默認返回false) 返回true frame發(fā)生改變就允許重新布局 內部會重新調用prepare 和


layoutAttributesForElementsInRect
 override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
  return true
 }

MARK:---用來計算出rect這個范圍內所有cell的UICollectionViewLayoutAttributes 對象,循環(huán)遍歷每個attribute對象,修改frame,再將這數(shù)組返回給系統(tǒng)


 override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
  //根據(jù)當前滾動進行對每個cell進行縮放
  //首先獲取 當前rect范圍內的 attributes對象
  let array = super.layoutAttributesForElements(in: rect)
  private let ScaleFactor:CGFloat = 0.001//縮放因子
  //計算縮放比 首先計算出整體中心點的X值 和每個cell的中心點X的值
  //用著兩個x值的差值 ,計算出絕對值
  //colleciotnView中心點的值
  let centerX = (collectionView?.contentOffset.x)! + (collectionView?.bounds.size.width)!/2
  //循環(huán)遍歷每個attributes對象 對每個對象進行縮放
  for attr in array! {
   //計算每個對象cell中心點的X值
   let cell_centerX = attr.center.x

   //計算兩個中心點的便宜(距離)
   //距離越大縮放比越小,距離小 縮放比越大,縮放比最大為1,即重合
   let distance = abs(cell_centerX-centerX)
   let scale:CGFloat = 1/(1+distance*ScaleFactor)
   attr.transform3D = CATransform3DMakeScale(1.0, scale, 1.0)

  }

  return array
 }

到目前為止,我們可以得到一個縮放的效果,但是仍然沒有達到我們要的效果,可視區(qū)域的cell并沒有居中顯示,而是滑到哪里就到哪里:

如下圖:


所以我們還得重寫一個方法:

func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint

需要注意的兩個參數(shù):

  • proposedContentOffset :手指滑動視圖最終停止的便宜量,并不是手指離開時的偏移量(congtentOffset)
  • velocity:手指滑動的速率

實現(xiàn)該方法:


/// <#Description#>
 ///
 /// - Parameter proposedContentOffset: 當手指滑動的時候 最終的停止的偏移量
 /// - Returns: 返回最后停止后的點
 override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
  let visibleX = proposedContentOffset.x
  let visibleY = proposedContentOffset.y
  let visibleW = collectionView?.bounds.size.width
  let visibleH = collectionView?.bounds.size.height
  //獲取可視區(qū)域
  let targetRect = CGRect(x: visibleX, y: visibleY, width: visibleW!, height: visibleH!)

  //中心點的值
  let centerX = proposedContentOffset.x + (collectionView?.bounds.size.width)!/2

  //獲取可視區(qū)域內的attributes對象
  let attrArr = super.layoutAttributesForElements(in: targetRect)!
  //如果第0個屬性距離最小
  var min_attr = attrArr[0]
  for attributes in attrArr {
   if (abs(attributes.center.x-centerX) < abs(min_attr.center.x-centerX)) {
    min_attr = attributes
   }
  }
  //計算出距離中心點 最小的那個cell 和整體中心點的偏移
  let ofsetX = min_attr.center.x - centerX
  return CGPoint(x: proposedContentOffset.x+ofsetX, y: proposedContentOffset.y)
 }

至此,整個過程結束,其實很簡單,主要是對這幾個方法理解!

最后代碼下載:

github下載地址:點這里

本地下載地址:http://xiazai.jb51.net/201707/yuanma/ScrollCardDemo(jb51.net).rar

總結

以上就是這篇文章的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對html5模板網(wǎng)的支持。

【網(wǎng)站聲明】本站部分內容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯(lián)系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要給大家介紹了關于RxSwift學習教程之類型對象Subject的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關于RxSwift學習教程之Observable的相關資料,文中詳細的給大家介紹了關于新建Observable、訂閱Observable和取消訂閱并消除內存泄漏等相關的內容,需要的朋友可以
RxSwift是Swift函數(shù)響應式編程的一個開源庫,由Github的ReactiveX組織開發(fā),維護。下面這篇文章主要給大家介紹了關于RxSwift學習之基礎篇的相關資料,文中通過示例代碼介紹的非常詳細,需
這篇文章主要為大家詳細介紹了Swift4.0 Array數(shù)組的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
CATransition動畫主要在過渡時使用,比如兩個頁面層級改變的時候添加一個轉場效果。CATransition分為兩類,一類是公開的動畫效果,一類是非公開的動畫效果。這篇文章主要給大家介紹了
近日,iPhone X的發(fā)布在人們群眾引起了很大的轟動,下面這篇文章主要給大家介紹了關于利用Swift如何判斷iPhone X機型的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面
主站蜘蛛池模板: 手持式3d激光扫描仪-便携式三维立体扫描仪-北京福禄克斯 | 辊道窑炉,辊道窑炉厂家-山东艾希尔 | 衬塑设备,衬四氟设备,衬氟设备-淄博鲲鹏防腐设备有限公司 | 铝合金线槽_铝型材加工_空调挡水板厂家-江阴炜福金属制品有限公司 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 北京环球北美考试院【官方网站】|北京托福培训班|北京托福培训 | 碳化硅,氮化硅,冰晶石,绢云母,氟化铝,白刚玉,棕刚玉,石墨,铝粉,铁粉,金属硅粉,金属铝粉,氧化铝粉,硅微粉,蓝晶石,红柱石,莫来石,粉煤灰,三聚磷酸钠,六偏磷酸钠,硫酸镁-皓泉新材料 | 耐热钢-耐磨钢-山东聚金合金钢铸造有限公司 | 民用音响-拉杆音响-家用音响-ktv专用音响-万昌科技 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 高效复合碳源-多核碳源生产厂家-污水处理反硝化菌种一长隆科技库巴鲁 | 异噻唑啉酮-均三嗪-三丹油-1227-中北杀菌剂厂家 | 锂电混合机-新能源混合机-正极材料混料机-高镍,三元材料混料机-负极,包覆混合机-贝尔专业混合混料搅拌机械系统设备厂家 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 水厂自动化-水厂控制系统-泵站自动化|控制系统-闸门自动化控制-济南华通中控科技有限公司 | 实验室pH计|电导率仪|溶解氧测定仪|离子浓度计|多参数水质分析仪|pH电极-上海般特仪器有限公司 | Maneurop/美优乐压缩机,活塞压缩机,型号规格,技术参数,尺寸图片,价格经销商 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 山东信蓝建设有限公司官网 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 测试治具|过炉治具|过锡炉治具|工装夹具|测试夹具|允睿自动化设备 | 诗词大全-古诗名句 - 古诗词赏析 | 建筑工程资质合作-工程资质加盟分公司-建筑资质加盟 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 中视电广_短视频拍摄_短视频推广_短视频代运营_宣传片拍摄_影视广告制作_中视电广 | 胶水,胶粘剂,AB胶,环氧胶,UV胶水,高温胶,快干胶,密封胶,结构胶,电子胶,厌氧胶,高温胶水,电子胶水-东莞聚力-聚厉胶粘 | 济南品牌设计-济南品牌策划-即合品牌策划设计-山东即合官网 | bkzzy在职研究生网 - 在职研究生招生信息咨询平台 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 升降机-高空作业车租赁-蜘蛛车-曲臂式伸缩臂剪叉式液压升降平台-脚手架-【普雷斯特公司厂家】 | 中矗模型-深圳中矗模型设计有限公司| 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 佛山市钱丰金属不锈钢蜂窝板定制厂家|不锈钢装饰线条|不锈钢屏风| 电梯装饰板|不锈钢蜂窝板不锈钢工艺板材厂家佛山市钱丰金属制品有限公司 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 |