[Ios] 最後のUITableViewCell内のUICollectionViewと一致するスクロール どうやって?


Answers

今すぐ動作させることはできますが、コレクションビューをテーブルビュー(両方のUIScrollViewサブクラス)に埋め込むことは良い考えではなく、appleが実装を変更するとすぐにバグします。

単一のUICollectionViewレイアウトに移行してください。 結局のところ、テーブルビューでできるコレクションビューでは達成できないことは何もありません。

2つ(またはそれ以上)のコレクションビューセクションで「テーブルビュー」と「コレクションビュー」を分離し、次にlayoutAttributesForItemAtIndexPath:を実装します。これはindexPath.sectionに従ってindexPath.sectionます。

それをテーブルビューにするには、コレクションビューと同じwidthフレームを返す必要があります。

あなたのレイアウトがより簡単な場合は、 UICollectionViewFlowLayout (多分既にあります)を使用し、上記のようにcollectionView:layout:sizeForItemAtIndexPath:を実装することができます。

Question

私はこれ以上頭を上げていますが、これが可能でなければならないことは分かっていますが、ドキュメンテーションのすべてを調べてもうまくいくわけではありません。

基本的には、UITableViewのLASTセルにUICollectionViewがあります。 私がしたいのは、UITableViewが完全に一番下までスクロールされているときだけ、UICollectionViewが最後のセルのスクロールを開始できるかどうかです。 また、ドラッグ/パン中にTableViewオフセットがCollectionViewのtableviewcellの一番下に達すると、現在のテーブルビュードラッグ/パンの追加のドラッグは、テーブルビューではなくコレクションビューに影響します。

また、コレクションビューがスクロールしているときに、ユーザーがコレクションビューのスクロールを開始した場合、コレクションビューがスクロールの上部(コンテンツYオフセットが0以下)に達した場合、現在のパン/ドラッグジェスチャーの追加スクロール影響を与えると、含まれているテーブルビューが上にスクロールする必要があります。

この効果を達成したい理由は、コレクションビューを含む最後のセルの上にあるテーブルビューセルには、UICollectionViewの内容を切り替えるUISegmentControlが含まれていて、いつでもこのセグメントを切り替えることができるためですCollectionViewでスクロールしています。 つまり、コレクションビューはスクロールする必要がありますが、親テーブルビューはスクロールしない必要があります。

私はジェスチャーレコグナイザーを試してみました。

 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:

コレクションビューが負のオフセット(過去のオフセットを超えている)にスクロールする場合、またはテーブルビューがその全体のスクロールの最後に達した場合、このメソッドにはい/いいえを返すフラグを使用できます。私は達成したいものに近づいていますが、コレクションビューでゆっくりとスクロールすると、同時レコグナイザーは起動しません。テーブルビューをあまりにもゆっくりとスクロールすると同じことが起こります。

別の問題は、コレクションビューがバウンスしないようにすることです。 しかし、バウンスをNOに設定すると、同時レコグナイザはまったく発火しません。 私は、y offsetがゼロ以下になるとviewViewScrollのコレクションビューでCGPointZeroにコンテンツオフセットを設定しようとしました。 これは動作しませんし、同時にメソッドが発火するのを防ぎます...

誰も何をすべきか考えていますか? 正しい方向に私を向ける何か?

更新 -

それでもやってみると、私は達成しようとしている振る舞いにほとんど進展していません。 私はwillBeginDraggingで試したように、viewDidScrollメソッドでuserInteractionEnabledをトグルしてしまいました。 scrollEnabledプロパティと同じです。いいえ運:(私はこれで欲しいものに似た動作をしますが、親ビューはスクロールして画面を外して再びスクロールしようとします。

更新 -

スクロール中に現在スクロールイベントを処理しているpanGestureRecognizerを移行する方法はありますか? スクロールハンドラを子から親に移すことができますが、それでもスクロールすると私の問題は解決します。 私はリンゴのジェスチャーに関連するとuiscrollview関連のドキュメントを見てきましたし、それに近いものは何も見つかりません。

更新 -

ちょうどこのようなものを試し終わった。

- (CGPoint)maxParentContentOffset
{
    return CGPointMake(0, self.parentScrollView.contentSize.height - self.frame.size.height - 44);
}

- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
{
    if (self.contentOffset.y > 0) {
        self.parentScrollView.contentOffset = [self maxParentContentOffset];
    }
}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (scrollView.contentOffset.y < 0) {
        scrollView.contentOffset = CGPointZero;
    }
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    CGPoint translation = [scrollView.panGestureRecognizer velocityInView:scrollView.superview];
    if (translation.y < 0) {
        [UIView animateWithDuration:0.5f animations:^(void) {
            self.parentScrollView.contentOffset = [self maxParentContentOffset];
        }];
    }
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    return YES;
}

しかし、問題があります...何らかの理由で、次のメソッドで不正なアクセスエラーが発生し続ける

- (void)parentScrollViewDidScroll:(UIScrollView *)parentScrollView
    {
        if (self.contentOffset.y > 0) {
            self.parentScrollView.contentOffset = [self maxParentContentOffset];
        }
    }

コンテンツのオフセットを特に設定します。 ブレークポイントでは、parentScrollViewとselfが設定されているのが分かります。これは本当に奇妙です。 それは悪いアクセスではないが、それは何らかの理由で無限ループに閉じ込められているのだろうか? 何か案は?