【问题标题】:Is it possible to 'split' a UIViewController and animate the parts to the top and bottom of the selected cell是否可以“拆分” UIViewController 并将部件动画到所选单元格的顶部和底部
【发布时间】:2014-10-27 10:42:39
【问题描述】:

我有一个我们的团队想做的模型。基本上,当用户选择一个单元格时,所选单元格上方的部分动画到顶部,单元格下方的部分动画到底部。根据所选单元格在屏幕中的位置,它可以滚动到顶部或底部。它将显示所选单元格的“详细”控制器。主列表上的 Hotel Tonight 应用程序提供了一个很好的例子。

这是一个示例:

所以我的问题是,我知道我可以拆分 UITableView 但如何拆分?我在想它可以作为 UICollectionView 来完成,因为可以为单个元素设置动画。或者可能是 UIView 屏幕截图。

【问题讨论】:

  • 您在图片中显示的内容和Hotels Tonight 的内容在我看来是两件不同的事情,所以我不确定您想要哪个。在 Hotels Tonight 应用程序中,在我看来他们将表格视图分成两半(实际上它可能是表格视图的图像),将两个有向相反的方向移动,露出黑色背景,在细节控制器中淡入淡出.此时,您看不到表格视图的任何其他单元格,这看起来就像您在图像中看到的那样。
  • 我试图显示动画,但希望它像 HotelTonight 应用程序一样,其中顶部和底部被完全移除,并且(理想情况下)当您单击返回时,tableview 片段动画返回。所以一定要寻找HotelTonight 的体验。我试图专注于表格视图的拆分 - 我认为你是对的,它可能是 UIView 快照 - 不过我不太确定。

标签: ios uitableview


【解决方案1】:

我还没有尝试过类似 Hotels Tonight 应用程序的任何东西,但我认为完成该外观所需的步骤是这样的,

1) 从具有黑色主视图的 UIViewController 中的表视图开始

2) 使用 renderInContext 创建表格视图的图像,

- (UIImage *)imageWithView:(UIView *)view {
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(view.bounds.size.width, view.bounds.size.height), view.opaque, [[UIScreen mainScreen] scale]);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
} 

3) 用你的第一张图片制作两张像这样的图片,

-(NSArray *)createHalvedImages:(CGImageRef) image {
    NSMutableArray *arr = [NSMutableArray array];
    for(int i = 0; i < 2; i++){
            float y = i * image.size.height/2.0;
            CGImageRef tmp = CGImageCreateWithImageInRect(image, CGRectMake(0, y, image.size.width, image.size.height/2));
            [arr addObject:[UIImage imageWithCGImage:tmp]];
        }
    }
    return arr;
}

4) 将表格视图替换为包含您的两个图像的两个图像视图。

5) 动画出两个图像视图以显示控制器的黑色主视图

6) 使用淡入淡出动画以模态方式呈现细节控制器

【讨论】:

  • 谢谢,我认为这是一般的想法。让我试着在今天或明天花一些时间来编写代码。
  • 我昨天确实花了一些时间想出了这个:github.com/trestles/split-uitableview;主要区别在于处理拆分哪个单元格,并在该特定时刻添加快照以反映 tableView 是否被滚动。
  • @timpone,好的,我检查过了。它看起来不像Hotel Tonight动画。应该这样吗?
  • 在拆分 UIViewController 方面,我认为确实如此。我不理会 alpha、easingin / easingout 等......并且超越了 UITableView 的拆分。但你可能有更敏锐的眼光 - 接受请求:)
  • @timpone,您是在谈论名为 testview2 的应用程序吗?那是我下载的,但该应用程序中没有任何东西可以拆分视图控制器。你确定你的链接是正确的?
【解决方案2】:

您可以使用多个UIViews,将它们放在另一个之上,无论该集合是静态的还是非静态的。确定每个状态的尺寸,并弄清楚如何将每个UIViews 调整为您想要的尺寸。

在您的视图控制器中使用UITapGestureRecognizer,并在handleTap: 中使用hitTest:withEvent: 在每个selfpointInside:withEvent: 上调用每个UIView 以确定哪个被点击。然后使用一种方法来展开 UIView 并折叠其他的...

为了使变化动起来,我是动画块的忠实粉丝。你可以阅读他们的信息here

【讨论】:

    【解决方案3】:

    如果您要显示多条记录,请使用 tableview。当用户选择任何单元格达到您想要的高度时,增加行高。您可以通过 tableview 委托方法和编辑 tableview 来解决所有这些问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多