1

我正在为 iPad 实施一个表格并面临一些主要问题。

对于 GridView,我实现了自己的 UITableViewCell 子类,效果很好。

数据显示正确,但是当我想访问单个单元格以转到一些新的详细信息视图时出现问题。由于一行只包含一个单元格,didSelectRowAtIndexPath 只能让我访问完整的单元格,但我不知道单个单元格在哪一列。

然后我实现了一个 TapGestureRecognizer。这向我显示了行和列并且有效,但直到我开始滚动......列部分仍然有效,但行显示不正确,因为 TapRecognizer 与 didSelectRowAtIndexPath 重叠(不好但不是那么重要的副作用.. 没有选定行的蓝色突出显示)。

有没有办法找出我滚动了多少像素?还是有更好的解决方案?

4

3 回答 3

2

我强烈建议使用UICollectionView超过那些 3rd 方类。访问所有委托协议有很多优点(例如,UIMenuController在没有 的情况下长按显示剪切复制粘贴UIGestureRecognizer)我自己使用一个作为网格。

为了实现网格布局,我做了以下...

1)我在我的 .h 文件中设置了以下代表:

@interface YourViewControllerWithCollectionView : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> {

}

@property (nonatomic, retain) IBOutlet UICollectionView *myCollectionView;

@end

注意,我没有设置,UICollectionViewDelegate因为UICollectionViewDelegateFlowLayout实际上是 的子协议UICollectionViewDelegate,所以不需要同时设置。

2)在.m文件中,合成collection view,在viewDidLoad中声明datasource和delegate:(别忘了连接outlet,你可能想在cell上加上背景色,这样你就可以看到了)

@synthesize myCollectionView;

查看加载:

    - (void)viewDidLoad
    {
    self.myCollectionView.delegate = self;
    self.myCollectionView.dataSource = self;

    //...

    }

3)实现数据源

#pragma mark - UICollectionView Datasource

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {

        return 1;
    }

    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {

        //the number of cells you want per row
        return 4;
    }

    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

        //load sublassed UICollectionViewCell called MyCollectionViewCell

        static NSString *cellIdentifier = @"cell";
        MyCustomCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];

                cell.title.text = @"Title"
                // customize the cell...

        return cell;

}

5)实施UICollectionViewDelegateFlowLayout

#pragma mark – UICollectionViewDelegateFlowLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {

    //this is what forces the collectionview to only display 4 cells for both orientations. Changing the "-80" will adjust the horizontal space between the cells.
    CGSize retval = CGSizeMake((myCollectionView.frame.size.width - 80) / 4, 78);

    return retval;
}

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {

    // for the entire section, which we have set to 1, adjust the space at 
    // (top, left, bottom, right)
    // keep in mind if you change this, you will need to adjust the retVal
    // in the method above

    return UIEdgeInsetsMake(5, 20, 10, 20);
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {

    CGFloat interimSpacing = 0.0f;

    return interimSpacing;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {

    CGFloat lineSpacing = 0.0f;

    return lineSpacing;
}

6)最后但同样重要的是,在方向更改时使布局无效以重绘单元格:

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                               duration:(NSTimeInterval)duration{

    [self.myCollectionView.collectionViewLayout invalidateLayout];

}

并且因为您实现UICollectionViewDelegateFlowLayout了 ,您已经可以访问UICollectionViewDelegate处理选择等,例如:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCollectionViewCell *cell = (MyCollectionViewCell *)[collectionView cellForItemAtIndexPath:indexPath];

   //do something when a cell is tapped...
}

更多信息可以在这里找到:http ://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12

于 2013-01-12T16:30:24.360 回答
0

查看CocoaControls.com 上的AQGridView或其他一些控件

于 2013-01-12T14:47:03.987 回答
0

我建议反对 UICollectionView。UICollectionView 易于使用,但目前还不够稳定。我正在为我的应用程序使用GMGridView。经过几个月的运行,我可以说它对于生产版本来说已经足够稳定了。另一种选择是 PSTCollectionView,它是 UICollectionView 的 100% API 兼容替代品。但是,它还没有完成,并且包含比 UICollectionView更多的错误。

PSTCollectionView 令人不安的问题是:

  1. 如果您想在屏幕上显示 > 80 个单元格,则性能不佳
  2. 未实现重新加载部分
  3. 装饰视图未实现

我遇到的 UICollectionView 令人不安的问题是:

  1. 第一列中的项目可能会消失
  2. 插入第一个单元格会崩溃
  3. 使用标题视图重新加载部分将崩溃
  4. 单元格中的文字模糊

检查开放雷达 https://openradar.appspot.com/search?query=UICollectionView 以了解 UICollectionView 的所有当前问题。

我相信 UICollectionView 和 PSTCollectionView 在稳定时会是不错的选择。但此时此刻,GMGridView是更好的选择。

于 2013-02-08T19:59:43.073 回答