Могу ли я "вынуть" или "оторвать" ячейку из UICollectionView?

Примечание - возможно, UIViewControllerAnimatedTransitioning

https://developer.apple.com/library/ios/documentation/uikit/reference/UIViewControllerAnimatedTransitioning_Protocol/Reference/Reference.html

имеет значение здесь.

Примечание. Я только что понял, что новый жест iOS7 "проведите по экрану" - это концепция

есть некоторые ответы ЗДЕСЬ:

UICollectionView "swipe-away" в диспетчере приложений iOS7?


Представьте, что ваш iPad имеет UICollectionView ( "большой экран" ), вертикальный, который содержит 10 ячеек, каждый из которых говорит примерно 400x400. Представьте, что bigView находится в правой половине экрана, скажем.

Я хочу сделать это:

Возможно, появится номер ячейки 3.

Эта ячейка удаляется из коллекции (например, слева от экрана). TBC он перемещается за пределы UICollectionView. В идеале это становится нормальным UIView (скажем).

На самом деле я хочу:

(1) уничтожить остальные 9 ячеек

(2) полностью уничтожить UICollectionView

(3) на самом деле, преобразуйте одну ячейку, # 3, в (я думаю) UIView

Я возьму его оттуда!

Можно ли это сделать?

(a) можете ли вы "преобразовать" UICollectionViewCell в UIView (у вас есть UIView guts, которые вы можете "удалить"?)

(b) можете ли вы (возможно) уничтожить все остальные ячейки, оставив UICollectionView, действительно, действительно являющимся только одной ячейкой (и, возможно, переместите "все" )...

(c) существует ли какой-либо другой механизм "отрыва" из UICollectionView?


Работая над этим много, много раз сейчас, здесь в основном простейшее базовое решение.

У вас будет класс, который является буквальным представлением коллекции,

@interface BouncyItems : UICollectionViewController

в этом классе у вас будет файл didSelectItemAtIndexPath: или аналогичный:

вы можете легко попасть в соответствующую ячейку.

-(void)collectionView:(UICollectionView *)cv
  didSelectItemAtIndexPath:(NSIndexPath *)indexPath
    {
    NSInteger thisRow = indexPath.row;
    NSString *thatName = yourData.stuff[thisRow][@"nameField"];
    YourCellClass *cell = [cv cellForItemAtIndexPath:indexPath];

    NSLog(@"Yo, peeling off ....... %@  %@", theName);

    YourScene *parent = (YourScene *)self.parentViewController;
    [parent peelOff:cell.holder];
    }

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

Итак, в примере "YourScene" - это UIViewController, который действительно имеет несколько видов контейнеров. Один из этих представлений контейнеров - действительно рассматриваемый вид коллекции.

@interface YourScene:UIViewController
@property (nonatomic, strong) IBOutlet UIView *bouncyItemsContainer;
-(void)peelOff:(UIView *)peelMe;
@end

Обратите внимание, что в раскадровке, глядя на ваши BouncyItems, вы перетащили бы соединение из него в "bouncyItemsContainer"

(Не отличается от того, как вы подключаете кнопки в "YourScene" к соответствующим элементам IBOutlet.)

Итак, глядя на код в файле didSelectItemAtIndexPath, это легко,

    YourScene *parent = (YourScene *)self.parentViewController;
    [parent peelOff:cell.holder];

Что такое ".holder".. объясняется ниже.

Теперь, что такое рутина peelOff? Удивительно, но это просто.

Секретный соус - это код конвертации: <...

-(void)peelOff:(UIView *)peelMe
    {
    CGPoint oldCenter = [self.view
      convertPoint:peel.center
      fromView:peel.superview];
    [self.view addSubview:peelMe];
    peelMe.center = oldCenter;
    [self.bouncyItemsContainer exitLeft];
    }

{Вспомним, что addSubview: удобно удаляет представление из него старого супервизора, поэтому он делает все это для вас в одной строке кода.}

Итак, что это - первые три строки кода, вы удалили одну ячейку peelMe из представления контейнера. Теперь это просто часть обычной сцены, YourScene.

Затем просто "избавьтесь" от вида коллекции. В моем примере exitLeft просто анимирует его с экрана влево.

Итак, это идеально - вы нажимаете на одну ячейку; все остальное изображение коллекции оживляется с экрана (вы можете делать все, что хотите, сделать так, чтобы они "улетали", выходили наружу, падали - что угодно), и одна выбранная ячейка остается позади. Из-за "волшебной" строки кода конвертации все остается на месте.

Наконец, все ячейки должны иметь ".holder", который является.....

enter image description here

UIView, который содержит все в ячейке; это то, что вы снимаете. (Это единственное практическое решение, не вынимайте базовый .contentView ячейки.) Вы можете тщательно упорядочить белый/прозрачный фон и так, чтобы все "работало" правильно, если вы летаете вокруг на сцене.

Итак, все, что с ним связано.

Теперь у вас (1) избавился от вида коллекции, и (2) ваша YourScene владеет тем, что было ячейкой.

Итак, в peelOff: вы пройдете через .holder UIVIew, и, вероятно, вы также пройдете через некоторые ваши данные, как в "пользователь выбрал этот дом, чтобы увидеть интерьер" или что бы ни был ваш контекст.

Наконец, в исходном вопросе он упоминает, что затем перемещает очищенный вид, в некоторую позицию на YourScene. Конечно, просто оживите его, хотите ли вы, возможно, в peelOff:.

Надеюсь, что это поможет.

Ответ 1

Я сделал что-то в этом направлении. Я реализовал перетаскивание ячеек вокруг представления коллекции и между разделами. Мне также нужна была "внешняя цель" для представления коллекции, чтобы перетаскивать ячейки. Я просто отключил masksToBounds на уровне collectionView, и я смог перетащить свою фальшивую плавающую ячейку (представляющую реальную скрытую ячейку) за пределы представления коллекции.

Несмотря на это, я думаю, что гораздо проще скрыть ячейки, которые не "сфокусированы" в вашем примере, и при необходимости изменить изменения для выделенной ячейки.

Рассмотрите возможность реализации - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect и - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath в макете /s представления коллекции. Вы можете как ретранслировать свою коллекциюView для перемещения/изменения размера выделенной ячейки, так и установки кадра "уничтоженных" ячеек на экран, меньшего размера или иным образом измененного.

Вы также можете анимировать эти изменения макета или даже перемещаться между макетами, что может привести к очень изящным переходам.

Нет причин, по которым одна ячейка в коллекцииView не может быть очень большой и иметь совсем другой кадр, чем все остальные ячейки. Если бы я это сделал, я мог бы держать нормальные ячейки в одной секции, а фокусированную ячейку - единственной ячейкой в ​​другой (так как тривиально перемещать ячейки между разделами). Затем, используя вышеописанные методы, мне было бы легче использовать макет для ячеек в массе, поскольку я мог бы ссылаться на элементы по разделам.