0

aUIViewControllerを含む a があり、UIScrollViewそれ自体に aUITableViewと another の両方が含まれていますUIScrollView。ネストされた内部にUIScrollViewは別のUITableView.

の でViewDidAppearUIViewControllerテーブルの大きさ (画面よりもはるかに大きい) を計算し、サイズを設定してUIScrollViewから、テーブルに含まれるテーブルと一致するように のコンテンツ サイズを設定します (UIScrollViewテーブル自体ではなく、スクロールを提供します)。 . これはすべてシミュレーターでは正常に機能しますが、実際のデバイスでは停止し、プロセッサーが数十秒間 ~100% に固定されます。これは明らかに受け入れられません。誰かが理由を知っていますか?または、どうすれば回避できますか?

コードは次のようになります。

OuterScrollView.ContentSize = new SizeF (View.Frame.Width, tableHeight);
InnerScrollView.ContentSize = new SizeF (InnerTable.Frame.Width, tableHeight);
InnerScrollView.Frame = new RectangleF(InnerScrollView.Frame.Location,
                        new SizeF(InnerScrollView.Frame.Width, tableHeight));

// So far so good
OuterTable.Frame = new RectangleF(OuterTable.Frame.Location,
           new SizeF(OuterTable.Frame.Width, tableHeight));    // this slows everything down!!
InnerTable.Frame = new RectangleF(InnerTable.Frame.Location,
                   new SizeF(InnerTable.Frame.Width, tableHeight));    // and so does this

テーブル設定ステートメントとすべての両方を削除すると、.Frame十分に迅速に機能しますが、それらが含まれていると非常に遅くなります。そして、遅さはここでは直接ではなく、ベースへの呼び出しの後のどこかで発生しますViewDidAppear

更新:ひらめきがあり、テーブルのサイズ変更が問題である場合は、サイズ変更が不要になるようにテーブルを十分に大きくするだけでよいと考えました。私が持っている設定では、スクロールはテーブル自体ではなくスクロール ビューによって処理されているため、テーブルを非常に大きく設定し、スクロール ビューContentSizeでテーブルの空白部分を切り取ることができます。これは、希望どおりに表示されるという意味では機能しますが、実際にはさらに遅くなります! したがって、私の結論は、問題はテーブルのサイズ変更ではなく、非常に長い (この場合、高さを 4,000 に設定しました - サイズ変更で 2,354 に設定された) テーブルの存在です。

背景: 私がやろうとしていることをもう少し追加します。Apple の知恵では、コントロールのようなグリッドは誰も必要ないと判断したので、左端の列が所定の位置にとどまるグリッドのようなビューがある状況を設定しようとしていますが、右を水平にスクロールできます-ほとんどの列、および垂直方向にスクロールすると、すべてが同期されたままになります。いくつかの検索の後、私は解決策に出くわしました(申し訳ありませんが、どこを正確に思い出せませんか)。これは(シミュレーターで)少し調整するだけで機能します。基本的に、スクロール ビューがスクロールを処理できるように、スクロール ビューにテーブルを埋め込みます。レイアウトは次のようになります。

 +-------------------------Outer Scroll-------------------------+
 |                  +---------------Inner Scroll---------------+|
 |+--Fixed Table--+ |+---------Scrolling Table----------------+||
 ||               | ||                                        ||| 
 ||               | ||                                        |||
 ||               | ||                                        |||
 ||               | ||                                        |||
 ||               | ||                                        |||
 ||               | ||                                        |||
 |+---------------+ |+----------------------------------------+||
 |                  +------------------------------------------+|
 +--------------------------------------------------------------+

固定テーブルには、いくつかの列を持つカスタム セルがあり、スクロール テーブルには、残りの列を持つ別のカスタム セル (画面より幅が広い) があります。スクロール テーブルを水平方向にスクロールでき (内側のスクロール ビューのおかげで)、外側のスクロール ビューのおかげですべてを垂直方向にスクロールできます。

別の更新:テーブルを大きく設定すると、テーブルがセルを再利用しないことに問題があるようです。セルの再利用ロジックは、セルがテーブルのフレーム内にあるかどうかを判断することだけに拡張され、テーブルのその部分が実際に表示されているかどうかは判断できないと思います。したがって、50 個の項目がある場合、6 ~ 7 個を表示してからそれらのセルを再利用する代わりに、関係なく 50 個すべてを作成します。そこで、以前の試みを断念し、次のように 2 つのテーブル間のスクロールを同期させようとしました。

OuterTable.Scrolled += (sender, arg) =>
        {
            InnerTable.ContentOffset = new PointF(InnerTable.ContentOffset.X,
                OuterTable.ContentOffset.Y);
        };

InnerTable.Scrolled += (sender, arg) =>
        {
            OuterTable.ContentOffset = new PointF(0, InnerTable.ContentOffset.Y);
        };

iOS がテーブルの水平スクロールを好まないことを除いて、これはほとんど機能します。そのため、内側のテーブルをスクロール ビューでラップする必要があります (スクロールContentSizeする必要がある幅をカバーするように で設定します)。この時点でほぼ動作します。通常、同期はシームレスに保たれますが、少しいじると、たとえば、内側のテーブルを斜めにスクロールすることができます (全員に方向ロックを設定しているにもかかわらず)。 、本当にばかげているように見えます。そのため、視覚的にはうまく機能しませんが、少なくとも UI スレッドをそれほどハングアップさせることはありません。

4

3 に答える 3

1

自動レイアウトでこれを試しましたか?ビューが実際にサイズ変更されたときに責任を負うことはありません.viewDidLoadで制約を設定し、残りはシステムに任せてください.

しかし、手動レイアウトに関しては、なぜこれが実際に起こるのかわかりません。Instruments でプロファイリングしたとき、Time Profiler で遅い部分は何でしたか?

于 2013-09-13T18:55:53.963 に答える
1

ドキュメントから:

重要: UIWebView または UITableView オブジェクトを UIScrollView オブジェクトに埋め込まないでください。これを行うと、2 つのオブジェクトのタッチ イベントが混同され、誤って処理される可能性があるため、予期しない動作が発生する可能性があります。

タッチ イベントが間違ったオブジェクトによって処理されるため、インターフェイスが遅く見える場合があります。これにより、スクロール ビューがジャンプしたり、動作が遅くなったり、まったく応答しないように見えることがあります。

あなたが目指している行動を説明できますか?UIScrollView を含む UITableView のみ、またはおそらく UICollectionView を使用して、目的を達成できますか?

于 2013-09-16T14:37:48.740 に答える