如何为组合式UICollectionViewLayouts的NSCollectionLayoutVisibleItem制作动画?

问题描述 投票:0回答:1

我正在尝试iOS13中引入的新的组合式布局API,它们非常棒--但我遇到了一个特别的问题,而且关于它的官方文档非常少。

我希望在一个动画上执行一个 NSCollectionLayoutVisibleItem 使用 visibleItemsInvalidationHandler. 到目前为止,我已经尝试了两种不同的方法。

  1. 用... UIView 财产动画师
layoutSection.visibleItemsInvalidationHandler = { (visibleItems, offset, env) in
    let normalizedOffsetX = offset.x + centeredPadding
    let centerPoint = CGPoint(x: normalizedOffsetX + collectionView.bounds.width / 2, y: 20)
    visibleItems.forEach({ item in
         UIView.animate(withDuration: 0.3) {
             item.transform = item.frame.contains(centerPoint) ? .identity : CGAffineTransform(scaleX: 0.9, y: 0.9)
         }
    })
}
  1. 使用 CATransaction 动画师
layoutSection.visibleItemsInvalidationHandler = { (visibleItems, offset, env) in
    let normalizedOffsetX = offset.x + centeredPadding
    let centerPoint = CGPoint(x: normalizedOffsetX + collectionView.bounds.width / 2, y: 20)
    visibleItems.forEach({ item in
        CATransaction.begin()
        CATransaction.setAnimationDuration(0.3)
        CATransaction.setCompletionBlock {
            item.transform = item.frame.contains(centerPoint) ? .identity : CGAffineTransform(scaleX: 0.9, y: 0.9)
        }
        CATransaction.commit()
    })
}

这两种方法都不行--不过,虽然没有动画,但我确实看到了。transform 变化反映在用户界面上。

ios swift uicollectionview ios13 cgaffinetransform
1个回答
0
投票

我刚刚发现了如何做到这一点,希望这能帮助别人。关键似乎是使用 indexPath 上的财产 NSCollectionLayoutVisibleItem 然后检索 UITableViewCell 来自 UICollectionView 并在其上执行任何动画。

下面是我最终解决这个问题的方法。

layoutSection.visibleItemsInvalidationHandler = { (visibleItems, offset, env) in
    let normalizedOffsetX = offset.x + centeredPadding
    let centerPoint = CGPoint(x: normalizedOffsetX + collectionView.bounds.width / 2, y: 20)
    visibleItems.forEach({ item in
           guard let cell = collectionView.cellForItem(at: item.indexPath) else { return }
           UIView.animate(withDuration: 0.3) {
                cell.transform = item.frame.contains(centerPoint) ? .identity : CGAffineTransform(scaleX: 0.9, y: 0.9)
           }
     })
}
© www.soinside.com 2019 - 2024. All rights reserved.