私はこの問題に数日間苦労していて、オンラインで具体的な解決策を見つけることができないようですので、ここに行きます...
シナリオは単純です。スクロールビューでテーブルビューを展開する(つまり、スクロールできない)ようにしたいので、スクロールビュー内でビューのサイズを変更して移動する必要があります。これは、UIScrollViewをサブクラス化し、layoutSubviewsメソッドを再実装することで非常に簡単に実現しました(以下を参照)。
layoutSubViewsの実装:
- (void) layoutSubviews
{
[super layoutSubviews];
//Resize the UITableView containing all the rows (i.e. it should not scroll within the tableview)
UITableView *bt = [self.subviews objectAtIndex:0];
//1 - Set the height of the table cells
//2 - Calculate the total height for the tableview (i.e.: numberOfRows*rowHeight)
bt.frame = CGRectMake(bt.frame.origin.x, bt.frame.origin.y, bt.frame.size.width, ([bt numberOfRowsInSection:0]*bt.rowHeight));
//Move down the note text view, so that it don't overlaps the table.
UITextView *note = [self.subviews objectAtIndex:1];
note.frame = CGRectMake(note.frame.origin.x, (bt.frame.origin.y + bt.frame.size.height)+15, note.frame.size.width, note.frame.size.height);
//Set the content size to the scroll view.
//Note: If the note is hidden, then we should not include it (the same goes for the padding between note and table)
[self setContentSize: CGSizeMake(self.contentSize.width, bt.frame.size.height + note.frame.size.height)];
UIEdgeInsets insets = UIEdgeInsetsMake(0.0f, 0.0f, /*padding@bottom*/50.0f, 0.0f);
[self setContentInset:insets];
[self setScrollIndicatorInsets:insets];
}
上記の実装は私の問題を解決し、完全にレンダリングします。テーブルビューの各行が材料であるレシピをレンダリングするものと考えてみてください。それが私が目指していることです。
私のアプリはUITabBarを利用しており、スクロールビューで少し下にスクロールしてから別のタブに切り替えて戻る場合を除いて、すべてが正常にレンダリングおよび動作します。その後、スクロールビューが何らかの形で変更され、一番上までスクロールできなくなり(タブを切り替える前にどれだけ下にスクロールしたかによって異なります)、多少奇妙にレンダリングされます。
ステップ1: Step1.png(以下のURLを参照)
下にスクロールして、展開されたテーブルビューの下のテキストビューを表示できるようにします
ステップ2: step2-switched-back.png(以下のURLを参照)
[2番目]タブに切り替えて[最初]に戻ると、奇妙なレンダリング動作とスクロール動作が発生し、スクロールビューをスクロールしてテーブルビューの最初の行に到達できなくなります。
コードがそれ自体を物語っていると信じているので、サンプルプロジェクトを作成しました。誰かがこれを見て、私が何か間違ったことをしたかどうか、またはこれを回避する方法があるかどうかを指摘してくれることを願っています。 プロジェクトとスクリーンショットは次の場所で入手できます:http: //eddiex.se/tmp/demo/
前もって感謝します!