3

現在、フルスクリーンでSceneを備えたObjective-C iOSアプリケーションで作業しています。シーン。画面の中心にあるUICollectionViewCellを動的に決定するメソッドを作成します。

このコレクションビューで表示可能な画面の中央にあるセルをプログラムで変更できるようにするには、現在この機能を実現している方法は、コレクションビューでスクロールを停止するのを待つことです。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ 

    NSIndexPath *centerCellIndexPath = 
    [self.collectionViewFollwersFeed indexPathForItemAtPoint: 
    [self.view convertPoint:[self.view center] toView:self.collectionViewFollwersFeed]]; 

    UICollectionViewCell *cell; 
    NSString *CellIdentifier; 

    CellIdentifier = @"FollowersFeed"; 
    cell = [_collectionViewFollwersFeed cellForItemAtIndexPath:centerCellIndexPath]; 

    //edit cell here 

} 

この機能を達成するこの方法はある程度機能するが、細胞への変更が場合にのみ開始:そして以下の方法で見られるように、画面の中心部に位置しているどのようなセルの編集ユーザーはスクロールを停止します。

スクロールを停止することなく、新しいセルが中央の位置をカバーしている瞬間に、中央のセルに変更を加えることができます。このメソッドを編集して、新しいセルが画面の中央の位置を覆っている場合にのみ、このメソッドを呼び出す必要があります。

+0

scrollViewDidScrollはどうですか? – danh

答えて

3

私の教育を受けた同輩ともっと同意できませんでしたdahn

あなたは、細胞は、独自のを追跡するかもしれないことを行うには

...あなたはそれが中央に当たったとき、実際にスクロール位置だけではなく、「変更」とは、細胞に応じて何かをアニメーション化するかもしれない、と述べました位置:

// MyCollectionView's DataSource 

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"yourIdentifier" forIndexPath:indexPath]; 
    cell.observedScrollView = theScrollViewYouWantToTrack; 
    [cell startObservingPosition]; 
    return cell; 
} 

は、細胞サイクル

を保持避けるために、弱い observedScrollViewを保持していることを確認してください:

がインスタンス化のセルにscrollviewを渡します

次に、あなたのセルの.mファイルにKVOオブザーバを登録します。

// MyCollectionViewCell.m 

- (void)startObservingPosition { 
    if (self.observedScrollView) { 
     [self.observedScrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:NULL]; 
    } 
} 

は...セル割り当てを解除する前にKVOオブザーバを削除するか、他にクラッシュするようにしてください! enhanced KVO observer自分自身を自動的に解放するように構築しました

KVO Observerが起動するたびに(scrollViewがスクロールするとき)、位置を把握してそれに応じて反応させることができます。

この例では、セルが中央にあるときを検出する方法を示していますが、また、あなたはそんなに多くを行うことができます方法を示しています。私のCollectionViewで

// MyCollectionViewCell.m 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSString *, id> *)change context:(void *)context { 
    if ([keyPath isEqualToString:@"contentOffset"]) { 
     if (self.observedScrollView) { 
     CGPoint offset = self.observedScrollView.contentOffset; 
     CGRect contentViewRect = [self.contentView convertRect:self.contentView.bounds toView:self.observedScrollView]; 
     CGFloat contentViewCenterY = contentViewRect.origin.y + contentView.size.height * 0.5 - offset.y; 
     if (contentViewCenterY == self.observedScrollView.bounds.height * 0.5) { 
      // the contentView is in the center of the viewable feed. do your animations... 
     } 
     } 
    } 
} 
1

セルの編集== yuck。モデルの変更== nice。

indexOverCenterのようにデータソースにNSIntegerを追加します。 -1のような無効なものに初期化します。その後、デリゲートでは、状態を検出:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{ 

    NSIndexPath *centerCellIndexPath = 
    [self.collectionViewFollwersFeed indexPathForItemAtPoint: 
    [self.view convertPoint:[self.view center] toView:self.collectionViewFollwersFeed]]; 

    self.indexOverCenter = centerCellIndexPath.row; 
    // don't edit the cell here: yuck 
    // reload it: nice 
    [self.collectionViewFollwersFeed reloadItemsAtIndexPaths:@[ centerCellIndexPath ]]; 
} 

はindexOverCenterに渡さindePath行を比較し、cellForItemAtIndexであなたの「編集」の作業を行います。それらが等しい場合は、特別な書式設定を行います。

0

私はこのようにそれを得ています

private func findCenterIndex() -> Int { 
     let center = self.view.convert(numberCollectionView.center, to: self.numberCollectionView) 
     let row = numberCollectionView!.indexPathForItem(at: center)?.row 


     guard let index = row else { 

      return 0 
     } 


     self.rating = index 

     return index 

    } 

あなたは簡単にあなたの目的に変換することができます - Cコード

関連する問題