Переключение интерактивного макета UICollectionView с использованием API-интерфейсов iOS 7

Я пытаюсь получить доступ к новым API-интерфейсам iOS 7, которые позволяют осуществлять интерактивные, анимированные переходы контроллера просмотра, включая переходы между UICollectionViewLayout s.

Я взял и модифицировал образец кода из WWDC 2013, "iOS-CollectionViewTransition", который можно найти здесь: https://github.com/timarnold/UICollectionView-Transition-Demo

Оригинальное демо, которое не было в рабочем состоянии, когда я его нашел, можно получить с помощью учетной записи Apple Developer, здесь: https://developer.apple.com/downloads/index.action?name=WWDC%202013

Моя версия приложения представляет собой представление коллекции с двумя макетами, как с UICollectionViewFlowLayout макетами с различными свойствами.

Нажатие на ячейку в первом макете должным образом анимируется на второй, в том числе, вкратце, прокручиваемый текст на новом макете. Сначала я был смущен тем, что новый вид коллекций знает, чтобы установить его смещение содержимого, чтобы была видна соответствующая ячейка, но я узнал, что это делается на основе свойства selected представления представления коллекции.

Закрепление элемента в первом макете должно анимировать, используя UICollectionViewTransitionLayout, UIViewControllerAnimatedTransitioning и UIViewControllerInteractiveTransitioning, в новый макет. Это работает, но ячейка с зажатой ячейкой не прокручивается в новом макете или макете перехода.

Я попробовал установить свойство selected на укороченной ячейке в разных местах (чтобы попытаться имитировать поведение, описанное при нажатии на элемент, чтобы нажать новый контроллер представления), безрезультатно.

Любые идеи о том, как решить эту проблему?

Ответ 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.