您可以在过渡期间操纵自己,这实际上为您提供了比内置动画contentOffset
更细粒度的控制。UICollectionView's
例如,您可以像这样定义过渡布局,以在“to”和“from”偏移之间进行插值。您只需要根据您希望事情的结果来计算“到”偏移量:
@interface MyTransitionLayout : UICollectionViewTransitionLayout
@property (nonatomic) CGPoint fromContentOffset;
@property (nonatomic) CGPoint toContentOffset;
@end
#import "MyTransitionLayout.h"
@implementation MyTransitionLayout
- (void) setTransitionProgress:(CGFloat)transitionProgress
{
super.transitionProgress = transitionProgress;
CGFloat f = 1 - transitionProgress;
CGFloat t = transitionProgress;
CGPoint offset = CGPointMake(f * self.fromContentOffset.x + t * self.toContentOffset.x, f * self.fromContentOffset.y + t * self.toContentOffset.y);
self.collectionView.contentOffset = offset;
}
@end
需要注意的一件事是,contentOffset
当转换完成时,将重置为“from”值,但您可以通过将其设置回完成块中的“to”偏移量来否定它startInteractiveTransitionToCollectionViewLayout
CGPoint toContentOffset = ...;
[self.collectionViewController.collectionView startInteractiveTransitionToCollectionViewLayout:layout completion:^(BOOL completed, BOOL finish) {
if (finish) {
self.collectionView.contentOffset = toContentOffset;
}
}];
更新
我在新的 GitHub 库TLLayoutTransitioning中发布了这个实现和一个工作示例。该示例是非交互式的,旨在演示改进的动画效果setCollectionViewLayout:animated:completion
,但它利用了与上述技术相结合的交互式过渡 API。查看TLTransitionLayout
该类并尝试在示例工作区中运行“调整大小”示例。
也许TLTransitionLayout
可以完成你所需要的。
更新 2
我在 TLLayoutTransitioning 库中添加了一个交互式示例。尝试在示例工作区中运行“Pinch”示例。这个将可见细胞捏成一组。我正在研究另一个示例,该示例会捏住单个单元格,使单元格在过渡期间跟随您的手指,而其他单元格遵循默认的线性路径。
更新 3
我最近添加了更多内容偏移放置选项:最小、中心、顶部、左侧、底部和右侧。transitionToCollectionViewLayout:
现在支持 Warren Moore 的 AHEasing 库提供的 30 多种缓动函数。