UICollectionView更新动画

时间:2016-04-26 16:29:22

标签: swift animation uicollectionview

我有一个UICollectionView和一个休息api。我获取我的数据并将其保存到我创建的实体对象的数组中。我有实体对象代表用户,两个用户之间的连接和通知(因此用户可以在用户之间建立连接)。

我在UICollectionView中显示我的所有数据,UICollectionView有3个部分用于用户配置文件,通知以及他与其他用户的连接。每个人都有自己的原型单元格,并有自己的自定义类。

当我加载ViewController并开始更新数据(从api获取)时,我保存一个哈希来跟踪数据是否已更改。如果它已朝当前显示的数据改变,我将我的新数据对象保存到我的数据模型并调用方法" updateUI()"在我的ViewController。

到目前为止一切顺利,一切正常 - 但我希望我的CollectionView能够进行动画更新。

我通过互联网搜索并了解到CollectionView已经有添加和删除单元格的方法。但在我的情况下,我无法跟踪我的数据是如何更改的,我只知道如果哈希值发生了变化,它已经改变了。

所以当我打电话给" reloadData()"在我的" updateUI()" -method中,整个CollectionView闪烁,更新非常难看。

如何跟踪我的数据的更改方式,或者如何在我的" updateUI()" -method中显示到CollectionView时为datachange设置动画?

更新

在这里开始使用一些代码是我的数据处理程序,它包含我的视图的所有数据:

class DataHandler {

  static var connections : [Connection] = []
  static var ownProfile : User?
  static var notifications : [Notification] = []
  static var connectionsHash : String? = nil
  static var ownProfileHash : String? = nil
  static var notificationsHash : String? = nil
  static var overviewHash : String? = nil

  //plus getter and setter for every attribute
}

这就是我将我的json对象从api存储到我的数据处理程序中的方法,例如通知:

var notifications : [Notification] = []
for (_,notification):(String, JSON) in dataObject["notifications"] {
  let notificationObj = Notification(json: notification)
  notifications.append(notificationObj)
}
DataHandler.setNotifications(notifications)

在我的View Controller中,我使用DataHandler中的数据设置单元格:

  func collectionView(collectionView: UICollectionView,      cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    var cell : UICollectionViewCell!

    let notificationCell = collectionView.dequeueReusableCellWithReuseIdentifier("NotificationCell", forIndexPath: indexPath) as! NotificationCell
    let ownProfileCell = collectionView.dequeueReusableCellWithReuseIdentifier("OwnProfileCell", forIndexPath: indexPath) as! OwnProfileCell
    let overviewUserCell = collectionView.dequeueReusableCellWithReuseIdentifier("OverviewUserCell", forIndexPath: indexPath) as! OverviewUserCell

    switch indexPath.section {
    case 0:
      //setting up cell for notification
      //with data from DataHandler
      cell = notificationCell
    case 1:
      //setting up cell for own profile
      //with data from DataHandler
      cell = ownProfileCell
    case 2:
      //setting up cell for connected user
      //with data from DataHandler
      cell = overviewUserCell
    default: break

    }
    return cell
  }

我的api的典型回应如下:

{
  "success": true,
  "data": {
    "notifications": [
      {
        "id": 6,
        "lastAlarm": 1460493400,
        "alarmDelay": 0,
        "routine": 20000,
        "master": {
          "email": "*********",
          "id": 12,
          "created": 1454117165,
          "imageUrl": "http://192.168.2.171:9999/profileimages/4.jpg",
          "name": "**********",
          "lastReport": 1460857863
        },
        "active": false
      }
    ],
    "connections": [
      {
        "id": 3,
        "slave": {
          "email": "*********",
          "id": 12,
          "created": 1454117165,
          "imageUrl": "http://192.168.2.171:9999/profileimages/4.jpg",
          "name": "**********",
          "lastReport": 1460857863
        },
        "alarmDelay": 20000,
        "lastAlarm": 1460493400,
        "routine": 2000,
        "active": true
      },
      {
        "id": 4,
        "slave": {
          "email": "********",
          "id": 13,
          "created": 1454957407,
          "imageUrl": "http://192.168.2.171:9999/profileimages/5.jpg",
          "name": "*******",
          "lastReport": 0
        },
        "alarmDelay": 2000,
        "lastAlarm": 1460493400,
        "routine": 200,
        "active": true
      }
    ],
    "profile": {
      "id": 11,
      "shortestInterval": 300,
      "imageUrl": "http://192.168.2.171:9999/profileimages/3.jpg",
      "email": "********",
      "created": 1454117103,
      "name": "******",
      "lastReport": 1461674777
    }
  },
  "hash": "1c402ff86c8a3f9b7c0b2376d736fe47",
  "error": null
}

当我成功从api接收数据时,我在ViewController中调用了updateUI方法:

  func updateUI(animated : Bool) {
    self.userCollectionView.reloadData()
  }

我也为单元格制作了一些动画,但只是首先加载:

  func collectionView(collectionView: UICollectionView, willDisplayCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {
    if(duration == 0.5) {
      cell.layer.opacity = 0.0
      UIView.animateWithDuration(duration, animations: {
        cell.layer.opacity = 1.0
      })
    }
  }

0 个答案:

没有答案