我可以从UICollectionView中“取出”或“撕掉”一个单元格吗?

注意 – 这是可能的UIViewControllerAnimatedTransitioning

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

在这里是相关的。

注意 – 我刚刚意识到新的iOS7“轻扫”手势就是这个概念

这里有一些答案:

UICollectionView在iOS7应用程序pipe理器中“轻扫”?


想象一下,你的iPad有一个垂直的UICollectionView(“bigView”),它包含10个单元格,每个大约400×400。 想象一下,bigView是在屏幕的右半边。

我想做这个:

单元号3可能是点击。

该单元格收集视图移开 (例如,在屏幕的左侧)。 TBC移动到UICollectionView的边界之外。 理想情况下,它成为一个正常的UIView(说)。

其实我想:

(1)破坏其他9个细胞

(2)完全破坏UICollectionView

(3)实际上,将一个单元格#3转换为(我猜)一个UIView

我会从那里拿走它!

可以这样做吗?

(一)你可以“转换”一个UICollectionViewCell到一个UIView (它有一个UIView胆量,你可以“删除”??)

(b)你可以(也许)摧毁所有其他单元格,留下UICollectionView,实际上,它确实只是一个单元格(也许移动“整个事物”)…

(c)UICollectionView有没有其他的“撕掉”机制


经过这么多次的工作,这里几乎是最简单的基本解决scheme。

你将有一个类字面上的集合视图,

@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”中的button连接到相关的IBOutlet项目。)

所以,看看didSelectItemAtIndexPath中的代码,这是很容易的,

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

什么是“.holder”..下面解释。

现在常规的peelOff是什么? 令人惊讶的是这很简单。

秘诀就是convertPoint:代码行…

 -(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只是把它从屏幕左边移开。

所以,这是完美的 – 你点击一个单元格; 所有剩下的收集视图都会在屏幕上显示出来(你可以在那里做任何你想做的事情,让它们“飞走”,面对面地滚动,不pipe怎样),而选中的单元格仍然落后。 由于“magic”convertPoint行代码,一切都保持正确的位置。

最后所有单元格必须有一个“。

在这里输入图像说明

一个UIView,包含单元格中的所有内容; 这是你剥离。 (这是唯一的实际解决scheme,不要拿掉单元格的底层.contentView。)你可以仔细安排白色/清晰的背景,这样如果你在场景中飞行的东西,一切都“正常工作”。

所以,这就是它的一切。

你现在已经(1)摆脱了收集的观点,(2)YourScene拥有的东西是一个细胞。

所以,在peelOff:你可以通过.holder UIVIew,而且,你也可能会通过你的一些数据,比如“用户select这个房子来看内部”,或者你的上下文是什么。

最后在最初的问题中,它提到了将剥离的视图移动到YourScene上的某个位置。 当然,只需要animation就可以了,可能在peelOff :.

希望能帮助到你。

我已经做了一些这方面的工作。 我已经实现了在集合视图和部分之间拖动单元格。 我还需要一个“外部目标”的集合视图来拖动单元格。 我只closures了collectionView的图层上的masksToBounds,并且能够将我的假浮动单元(代表真实的隐藏单元格)拖到集合视图的边界之外。

无论如何,我认为在您的示例中基本上隐藏不“聚焦”的单元格会更容易,并根据需要为聚焦单元格制作animation。

考虑实施- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath在您的集合视图布局/ s。 您既可以重新布局您的collectionView,也可以移动/调整焦点单元格的大小,以及将“已销毁”单元格的框架设置为离屏,缩小或以其他方式修改。

您还可以为这些布局更改设置animation,甚至可以在布局之间移动,这可以实现非常漂亮的转场。

没有任何理由,collectionView中的一个单元格不可能非常大,并且与所有其他单元格的框架非常不同。 如果我要这样做,我可以将正常细胞保留在一个部分中,而将聚焦的细胞作为另一个细胞中的唯一细胞(因为在部分之间移动细胞是微不足道的)。 然后,使用上面的方法,我可以更轻松地整理单元格的布局,因为我可以按部分引用项目。