最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2017年07月21日 09:28:19   作者:醉春風  
卡片橫向滑動動畫效果相信對大家來說都不陌生,下面這篇文章主要給大家介紹了關(guān)于利用swift實現(xiàn)卡片橫向滑動動畫效果的方法示例,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面來一起看看吧。

本文主要給大家介紹了關(guān)于利用swift實現(xiàn)卡片橫向滑動動畫效果的相關(guā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不會居中,兩側(cè)cell也不會縮放,如下圖:


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

初始化方法 prepare , 初始化一些內(nèi)容:

//重寫prepare方法
 //布局之前的準備工作 初始化 這個方法每次layout發(fā)生改變就調(diào)用一次
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ā)生改變就允許重新布局 內(nèi)部會重新調(diào)用prepare 和

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

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

 override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
  //根據(jù)當前滾動進行對每個cell進行縮放
  //首先獲取 當前rect范圍內(nèi)的 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ū)域內(nèi)的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)
 }

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

最后代碼下載:

github下載地址:點這里

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

總結(jié)

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

相關(guān)文章

  • Swift中定義單例的方法實例

    Swift中定義單例的方法實例

    Swift中單例的寫法有很多種,下面這篇文章主要給大家介紹了關(guān)于Swift中定義單例的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • 詳解Swift中enum枚舉類型的用法

    詳解Swift中enum枚舉類型的用法

    Swift中通過enum關(guān)鍵字可以直接創(chuàng)建出枚舉對象,而且可以使用switch和case語句來進行流程控制,十分強大和靈活,這里我們就來詳解Swift中enum枚舉類型的用法
    2016-06-06
  • Swift編程中的一些類型轉(zhuǎn)換方法詳解

    Swift編程中的一些類型轉(zhuǎn)換方法詳解

    這篇文章主要介紹了Swift編程中的一些類型轉(zhuǎn)換方法詳解,是Swift入門學習中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-11-11
  • 詳解Swift面向?qū)ο缶幊讨械姆椒?method)

    詳解Swift面向?qū)ο缶幊讨械姆椒?method)

    既然面向?qū)ο竽蔷鸵欢〞衜ethod,方法和面向過程語言中的function函數(shù)并沒什么區(qū)別,只不過方法在面向?qū)ο笳Z言中可以被類來約束作用域,這里我們就來詳解Swift面向?qū)ο缶幊讨械姆椒?method)
    2016-07-07
  • swift中自定義正則表達式運算符=~詳解

    swift中自定義正則表達式運算符=~詳解

    這篇文章主要給大家介紹了關(guān)于swift中自定義正則表達式運算符=~的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-12-12
  • Swift實現(xiàn)文件壓縮和解壓示例代碼

    Swift實現(xiàn)文件壓縮和解壓示例代碼

    本篇文章主要介紹了Swift實現(xiàn)文件壓縮和解壓示例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • Swift實現(xiàn)表格視圖單元格單選(1)

    Swift實現(xiàn)表格視圖單元格單選(1)

    這篇文章主要為大家詳細介紹了Swift實現(xiàn)表格視圖單元格單選,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • swift內(nèi)存管理指針類型使用實例詳解

    swift內(nèi)存管理指針類型使用實例詳解

    這篇文章主要為大家介紹了swift內(nèi)存管理指針類型使用實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • 在Swift中如何使用正則表達式詳解

    在Swift中如何使用正則表達式詳解

    正則表達式是對字符串操作的一種邏輯公式,相信大家應該都不陌生,下面這篇文章主要給大家介紹了關(guān)于在Swift中如何使用正則表達式的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-09-09
  • Swift3.0 GCD定時器的使用DEMO

    Swift3.0 GCD定時器的使用DEMO

    這篇文章主要介紹了Swift3.0 GCD定時器的使用,實現(xiàn)倒計時,UIDatePicker的使用, 仿寫一個活動倒計時的DEMO,需要的朋友可以參考下
    2017-02-02

最新評論

民和| 郸城县| 乌兰察布市| 奉化市| 登封市| 富平县| 平罗县| 江西省| 柯坪县| 孙吴县| 英德市| 乐亭县| 政和县| 扶风县| 永春县| 韩城市| 阿合奇县| 安陆市| 石首市| 贵阳市| 织金县| 固原市| 合阳县| 大邑县| 鲁山县| 淅川县| 射阳县| 顺平县| 东乡| 芜湖县| 绥芬河市| 达尔| 镇平县| 隆尧县| 桃源县| 高清| 康马县| 扎囊县| 海伦市| 鱼台县| 湘西|