【问题标题】:iPhone/iPad SDK: homescreen/Photos style grid view?iPhone/iPad SDK:主屏幕/照片样式网格视图?
【发布时间】:2010-04-02 22:05:59
【问题描述】:

我正在构建一个 iPad 应用,并希望使用“平铺”显示,其中对象以可滚动的网格排列,类似于 iPhone/iPad 主屏幕和 iPad 照片应用。


我想要达到的目标:

http://dl.getdropbox.com/u/413086/mzl.nbioluoe.480x480-75.jpg

(iTunes link)

SDK 中是否有任何预先构建的方式来执行此操作?如果没有,我应该如何创建自己的?

更新:我想我了解如何在网格中对“对象”进行基本排列,但我不知道如何在不使用大量内存和制作的情况下使用数千个对象和可滚动视图进行这项工作一切都很慢(再说一次,我仍然没有设备可以测试)。



更新 2:

半个月后,我终于找到了理想的解决方案:AQGridView

【问题讨论】:

标签: iphone cocoa-touch ipad


【解决方案1】:

我建议使用 Three20 库并调整 TTLauncher 视图控制器。

【讨论】:

    【解决方案2】:

    对包含所有图块的视图使用或派生自 UIScrollView。要么实现委托- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 方法,要么覆盖- (void)setContentOffset:(CGPoint)contentOffset 方法。设置滚动视图的内容大小,就像所有图块都存在一样。

    当滚动视图滚动时,确定哪些图块将显示在屏幕上。然后要么使用 UITableView 对单元格的回收方案,要么根据需要添加新创建的图块,并在达到内存配额时删除离可见区域最远的图块。您的示例显示了完全可见的 2x3 磁贴,因此您需要至少保留 4x5 磁贴。

    如果你有两列图块并且没有水平滚动(从图片看不清楚),你可以直接使用 UITableView 并实现一个显示两个图块的自定义 UITableViewCell。

    如果您是从 UIScrollView 派生的,最好的做法是使用 dataSource 和委托回调来镜像 UITableView 使用的接口。您将拥有 numberOfRows:、numberOfColumns: 和 tileForRow:column: 而不是 numberOfRows:、numberOfSections: 和 cellForIndexPath:,但原则是相同的。看起来您可以使用固定大小的图块,这大大简化了事情。

    【讨论】:

    • 谢谢 - 这帮助很大。在我的实现中,我将布局代码放在我的 UIScrollView 子类的layoutSubviews 中,这似乎工作正常。你有什么特别的理由建议我实施scrollViewDidScroll:
    • 您可以选择从 UIScrollView 派生或成为委托人。如果您选择成为 vanilla UIScrollView 的代表,您可以在 scrollViewDidScroll 中完成布局工作。
    • 啊,好的。知道了!供参考:覆盖 layoutSubviews 在做动画等时给我带来了很大的麻烦。将 scrollViewDidScroll 实现为委托可以解决所有问题。
    【解决方案3】:

    我不知道有任何预先构建的方法可以做到这一点,但您通常希望采用两种方法:

    1) 如果网格不会(真的)改变,您可以直接在界面生成器中创建它。

    2) 如果您想要更灵活的方法,您可以通过计算每个元素的适当位置以编程方式在 UIViewController 中构建网格。例如:

    for(int i=0 ; i<num_rows ; i++) {
        for(int j=0 ; j<num_cols ; j++) {
            UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(j*50, i*50, 40, 40)] ;
            [self.view addSubview:myView] ;
            [myView release] ;
        }
    }
    

    【讨论】:

    • 将 UIView 替换为 UIView 的任何自定义子类
    • 我早先想到了#2,但我的问题是在处理数千个项目和滚动等时出现。我是否必须重建一个 UITableView 式的东西?
    【解决方案4】:

    您可以使用 UITableView 并在它们之间设置没有线条的行,并使用四种不同类型的行,每行包含两个子视图。这将为您处理所有视图的缓存。然后您可以忽略 didSelect... 并简单地为您添加到单元格的 contentView 的视图实现触摸。

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      相关资源
      最近更新 更多