1

iPad用のテーブルを実装していて、いくつかの大きな問題に直面しています。

GridView については、正常に動作する UITableViewCell の独自のサブクラスを実装しました。

データは正しく表示されますが、単一のセルにアクセスして新しい詳細ビューに移動するときに問題が発生します。1 つの行には 1 つのセルしか含まれていないため、didSelectRowAtIndexPath では完全なセルにしかアクセスできませんが、単一のセルがどの列にあるかはわかりません。

次に、TapGestureRecognizer を実装しました。これにより、行と列が表示されて機能しますが、スクロールを開始するまでのみ...列部分は引き続き機能しますが、TapRecognizer が didSelectRowAtIndexPath とオーバーラップするため、行が正しく表示されません (悪いが、それほど重要ではない副作用.. はありません選択した行が青色で強調表示されます)。

スクロールしたピクセル数を調べる方法はありますか? または、さらに良い解決策はありますか?

4

3 に答える 3

2

UICollectionViewこれらのサードパーティ クラスを使用することを強くお勧めします。すべてのデリゲート プロトコルにアクセスできることには、かなりの利点があります (たとえば、カット コピー ペーストUIMenuControllerを なしで長押しして表示するなど)。UIGestureRecognizer

グリッドレイアウトを実現するために、次のことを行いました...

1) .h ファイルに次のデリゲートを設定しました。

@interface YourViewControllerWithCollectionView : UIViewController <UICollectionViewDataSource, UICollectionViewDelegateFlowLayout> {

}

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

@end

は実際には のサブプロトコルであるUICollectionViewDelegateため、 を設定しなかったことに注意してください。したがって、両方を設定する必要はありません。UICollectionViewDelegateFlowLayoutUICollectionViewDelegate

2) .m ファイルで、コレクション ビューを合成し、viewDidLoad でデータソースとデリゲートを宣言します: (アウトレットを接続することを忘れないでください。セルに背景色を付けて、セルが見えるようにすることをお勧めします)

@synthesize myCollectionView;

viewdidLoad:

    - (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

AGAINST UICollectionView をお勧めします。UICollectionView は使いやすいですが、現時点では十分に安定していません。アプリにGMGridViewを使用しています。数か月の運用後、製品リリースに十分安定していると言えます。もう 1 つの代替手段は、UICollectionView の 100% API 互換の代替品である PSTCollectionView です。ただし、未完成であり、UICollectionView よりも多くのバグが含まれています。

私が PSTCollectionView で抱えている厄介な問題は次のとおりです。

  1. 画面に 80 個を超えるセルを表示する場合、パフォーマンスが低下する
  2. セクションのリロードは実装されていません
  3. 装飾ビューは実装されていません

私が UICollectionView で抱えている厄介な問題は次のとおりです。

  1. 最初の列の項目が消える場合があります
  2. 最初のセルを挿入するとクラッシュします
  3. ヘッダー ビューでセクションをリロードするとクラッシュする
  4. セル内のぼやけたテキスト

UICollectionView に関する現在の問題については、オープン レーダー https://openradar.appspot.com/search?query=UICollectionViewを確認してください。

UICollectionView と PSTCollectionView が安定している場合は、良い選択になると思います。しかし、現時点では、GMGridViewの方が適しています。

于 2013-02-08T19:59:43.073 に答える
0

AQGridViewまたはCocoaControls.comのその他のコントロールを見てください

于 2013-01-12T14:47:03.987 に答える