如何实现同位素 - 在iPhone上完成元素?

时间:2011-08-25 14:29:05

标签: iphone ios uitableview core-animation

请转到: http://isotope.metafizzy.co/demos/elements-complete.html

我想在iPhone上实现“Toggle variable size”部分。

更具体地说,我想在滚动视图上布置我的30多张照片(相同尺寸),我希望它看起来像“Toggle variable size”看起来像。

实现需要是原生的,我想通过视图控制器或一些带有自定义单元格的表视图。

您对iPhone上实现此功能的最佳方法有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在这个答案中,我将对如何解决你的问题提出一个非常高级的概述。

创建一个自定义滚动视图子类,比如说TiledGridView。为简单起见,我们假设界面看起来像这样:

@interface TiledGridView : UIScrollView {
    NSArray *tileData;
}
@property(retain) NSArray *tileData;
- (void)layoutSubviews;
@end

tileData数组包含有关切片(位置,大小和图像)的信息。在最简单的情况下,使用合成访问器设置tileData。您可以创建实际计算切片位置的ViewController,也可以在视图中添加方法。为了进一步讨论,我们假设tileData包含了我们需要的所有数据的所有数据,并且我们已经知道他们的位置等。

然后,最重要的部分是覆盖子类中的layoutSubviews消息。在layoutSubviews中,您将执行以下操作:

  • 检查TiledGridView
  • 的范围
  • 为这些范围内的切片添加UIImageView s(或任何您喜欢的内容)
  • 删除边界外的图块

您可以这样做,以便在有许多图像时不会耗尽内存。这也是UITableView的功能,但它们甚至可以重用视图。

伪实现看起来与此类似:

- (void)layoutSubviews {
  CGRect bounds = self.bounds;

  for (id tile in tileData) {
    if (/*tile is not yet visible and tile overlaps bounds*/) {
      UIView newTileView = /* create the view for the tile */
      [self insertSubview:newTileView atIndex:0];
   } else if (/*tile is visible and no longer overlaps bounds*/) {
      UIView oldTileView = /* fetch the corresponding view */
      [oldTileView removeFromSuperview];
    }
  }

这会使您的观看速度非常快,因为只会根据需要添加子视图。