aUIViewController
を含む a があり、UIScrollView
それ自体に aUITableView
と another の両方が含まれていますUIScrollView
。ネストされた内部にUIScrollView
は別のUITableView
.
の でViewDidAppear
、UIViewController
テーブルの大きさ (画面よりもはるかに大きい) を計算し、サイズを設定して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 スレッドをそれほどハングアップさせることはありません。