9

したがって、セルごとにカスタム UIView を持つ UICollectionView があります。UIView は画面全体を占め、4 つの異なる UIView/セルのそれぞれに水平に移動できます。これはすべて正常に機能し、ページャーを使用してコレクションビューのどのページにいるかを示します。

移動して最後のセルを通過した後、最初にループバックできるかどうかを確認するために、グーグルなどを調べました。たとえば、次のようになります。

3 番目のセルから始めて 4 番目に移動し、右にスワイプすると最初のセルに戻り (ページャーは最初のページにいることを反映します)、そこから続行します。

これは簡単ですか?または、何か不足していますか?

ありがとう、ジェイク

4

2 に答える 2

4

現在のビューの左側の画像、現在のビューの右側の画像、および現在画面に表示されている中央のビューを保持するために必要な UIView は 3 つだけです。

UIImages ABCD と UIViews 1 2 および 3 があるとしましょう

ビュー 2 の画像 B を見ています。左側のページでは画像 A が表示され、右側のページでは画像 C が表示されます。

左/ページ右にスワイプすると、ビュー 3 が画像 C のオンスクリーン ビューになります。ページングが停止したら、ビューの内容を入れ替えて、ユーザーが実際に画像 C の中央の UIView2 をもう一度見ているようにします。ビュー 1 には画像があります。 B、ビュー 3 にはイメージ D があります。

もう一度右にスクロールして、同じシャッフルを行います。今、あなたは持っています

View 1 -> image C
View 2 -> image D
View 3 -> image A

次のページ右

View 1 -> image D
View 2 -> image A
View 3 -> image B

など、どちらの方向にも無限に

2011 年のこのテーマに関する素晴らしい WWDC ビデオがあります。掘り下げる価値があります。これは UIScrollView のデモ ビデオ( Documentation as PDF ) です。これを行うために Collection Views は必要ありませんが、そうすべきではない理由はありません...

于 2013-01-10T02:13:42.120 に答える
3

この暑さの準備はいいですか?

したがって、メイン ビュー コントローラーの viewDidLoad で、配列内の uicollectionview セルに読み込むビューを識別します。

NSArray *vcs = [@"view5", @"view1", @"view2", @"view3", @"view4", @"view5", @"view1"]

また、pagecontrol カウントを次のように設定しました。

self.pageControl.numberOfPages = vcs.count - 2; // for the fake first and last cells

次に、メイン ビュー コントローラーの viewDidLoad でビュー コントローラーをインスタンス化し、コレクションビューのアルファを 0 に設定します。次に、scrollViewDidEndDecelerating でカルーセルを処理し (最後のセルから最初のセルへ、最初のセルから最後へ)、反映するように pageControl を更新します。 「実際の」ページ番号。

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    // Snaps into the cell    
    CGFloat pageWidth = scrollView.frame.size.width;
    float fractionalPage = scrollView.contentOffset.x / pageWidth;
    NSInteger page = lround(fractionalPage);

    self.pageControl.currentPage = page - 1; // because our first cell is the last cell for animation purposes only

    // Carousel from first to last and last to first while updating pagecontrol
    if (page == 0) {
        [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.activeGaugeClusters.count - 2 inSection:0]
                                    atScrollPosition:UICollectionViewScrollPositionLeft
                                            animated:NO];
        // Set our pagecontrol circles to the appropriate page indicator        
        self.pageControl.currentPage = self.activeGaugeClusters.count - 2;

    } else if (page == self.activeGaugeClusters.count -1) {
        [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:0]
                                    atScrollPosition:UICollectionViewScrollPositionLeft
                                            animated:NO];
        self.pageControl.currentPage = 0;
    }
}

次に、コレクションビューの実装で次のことを行います。

numberOfItemsInSection = vcs.count

および最初のセルをロードするための viewDidAppear (それが indexPath.row == 1 または 2 または 3 のセルであるかどうか... (1 は 0 ではなく最初の実際のページです)

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    [self.collectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:self.lastGaugePanel inSection:0]
                                atScrollPosition:UICollectionViewScrollPositionLeft
                                        animated:NO];
    self.pageControl.currentPage = self.lastGaugePanel - 1;
    [UIView animateWithDuration:0.5 animations:^{
        self.collectionView.alpha = 1.0;
    }];
}

私はそれを要約すると思います。メイン VC とコレクションビューの両方の残りの実装は標準です。これで、それぞれ独自のアニメーションなどを持つ他のビューとその VC をロードするコレクション ビューができました。indexPath.row を NSUserDefaults に保存して、私が去ったときにいたセルが、次の読み込み時に表示される最初のセルになるようにします。

これが誰かの助けになることを願っています。残念ながら、サードパーティのライブラリの使用は推奨されていなかったため、この悪い男の子を構築する必要がありました(@He Wasの助けを借りて、もう一度感謝します!)

于 2013-01-12T01:44:59.967 に答える