Ответ 1
Вы можете манипулировать contentOffset
самостоятельно во время перехода, что фактически дает вам более тонкий контроль, чем встроенная анимация UICollectionView's
.
Например, вы можете определить свой макет перехода таким образом, чтобы интерполировать между смещениями "до" и "от". Вам просто нужно вычислить "чтобы" компенсировать себя на основе того, как вы хотите, чтобы все закончилось:
@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
будет reset к значению "from", когда переход завершится, но вы можете отменить это, вернув его обратно к смещению "to" в блоке завершения startInteractiveTransitionToCollectionViewLayout
CGPoint toContentOffset = ...;
[self.collectionViewController.collectionView startInteractiveTransitionToCollectionViewLayout:layout completion:^(BOOL completed, BOOL finish) {
if (finish) {
self.collectionView.contentOffset = toContentOffset;
}
}];
UPDATE
Я опубликовал реализацию этого и рабочего примера в новой библиотеке GitHub TLLayoutTransitioning. Пример неинтерактивный, предназначенный для демонстрации улучшенной анимации по сравнению с setCollectionViewLayout:animated:completion
, но он использует интерактивные переходные API в сочетании с описанной выше методикой. Взгляните на TLTransitionLayout
класс и попробуйте запустить "Resize" пример в рабочей области Примеры.
Возможно, TLTransitionLayout
может выполнить то, что вам нужно.
ОБНОВЛЕНИЕ 2
Я добавил интерактивный пример в библиотеку TLLayoutTransitioning. Попробуйте запустить "Pinch" пример в рабочей области Примеры. Это зажимает видимые клетки как группу. Я работаю над другим примером, который зажимает отдельную ячейку, так что ячейка следует за вашими пальцами во время перехода, в то время как другие ячейки следуют по линейному пути по умолчанию.
ОБНОВЛЕНИЕ 3
Недавно я добавил дополнительные возможности размещения смещения контента: минимальный, центр, верхний, левый, нижний и правый. И transitionToCollectionViewLayout:
теперь поддерживает более 30 функций облегчения благодаря Warren Moore AHEasing library.