2011-01-04 12 views
2

私は行とセクションを持つUITableViewを持っています。 2番目のセクションの最初の項目にスクロールして、最初のセクションのヘッダーを表示させたいとします。その状態に達するまで手動でリストをスクロールした場合と同様にIphone:第1セクションのヘッダーを表示させる第2セクションの1番目のセルにスクロールする方法

---- TOP OF SCREEN ---- 
Header of first section 
Header of the second section 
cell 1 
cell 2 
cell 3 
Header of the third section 
cell 1 
cell 2 
... 

scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] 仕事をしないが、それは最初のセクションのヘッダーを非表示にします。

答えて

4

私たちは動いています。私はこの方法をKevinの考えに基づいて見つけました。アニメーションをYESに設定するには、UIScrollViewのデリゲートメソッドを使用してアニメーションの最後をキャッチします。できます。しかし、2つのアニメーションをしないとどんな解決策も大いに評価されるでしょう。 これを行う方法についてのご意見はありますか?

- (IBAction) scrollToToday:(BOOL)animate { 
    [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:animate]; 
    if (animate == NO) [self showFirstHeaderLine:NO]; 
} 

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { 
    [self showFirstHeaderLine:YES]; 
} 

- (void) showFirstHeaderLine:(BOOL)animate { 
    CGRect headerRect = [self.tableView rectForHeaderInSection:1]; 
    CGPoint scrollPoint = headerRect.origin; 
    scrollPoint.y -= headerRect.size.height; 
    [self.tableView setContentOffset:scrollPoint animated:animate]; 
} 

このコードへおい、アニメーションがYESに設定されているプロセスが無限にscrollViewDidEndScrollingAnimationとshowFirstHeaderLine beetweenループが...それは、はい、一度だけ... 任意のアイデア理由についてループする必要がありますか?

+0

この種のことは、元の質問の編集としてよく行われます。 –

+0

しかし、解決策を使って質問を編集すると、これはもう問題にならないでしょう:-) – Oliver

2

希望する行の矩形をつかんで、前のセクションのヘッダーの高さを引いて、その点までスクロールすることができます。次のような(テストされていない)ものはうまくいくはずです。

CGRect rowRect = [table rectForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]]; 
CGRect headerRect = [table rectForHeaderInSection:0]; 
rowRect.origin.y -= headerRect.size.height; 
rowRect.size.height += headerRect.size.height; 
[table scrollRectToVisible:rowRect animated:YES]; // UITableView is a subclass of UIScrollView 
+0

これはいい考えですが、これはうまくいきません。実際には行は既に表示されているため、おそらく何もしません。しかし、このアイデアを守れば、物事を起こさせて隠されたヘッダーを表示するために少しスクロールすることは可能でしょうか? – Oliver

+0

ああ、既に表示されている場合、これは何もしません。あなたができることは、元のY座標( 'rowRect.origin.y - headerRect.size.height')を計算して代わりに' contentOffset'プロパティを設定することです( '-setContentOffset:animated: 'それをアニメートにする)。 –

0

私はあなたのコードを試して、それは動作します!

ループの質問では、オフセット(SetContentOffset)を設定しているため、スクロールとは関係ありません。 scrollViewデリゲートを呼び出さない。したがって、scrollViewDidEndScrollingAnimationはscrollToRowAtIndexPathから呼び出された1回だけ呼び出されます。

関連する問題