IOS6では、UITableViewの上部にスクロールする次のコードがあります
[tableView setContentOffset:CGPointZero animated:YES];
IOS7では、これはもう機能しません。テーブルビューは完全に上部までスクロールされません(ただし、ほとんど)。
ここの他のいくつかの回答からの助けによって、私はそれをうまく機能させることができました。クラッシュを避けるために、まずいくつかのセクションがあることを確認する必要があります。 NsNotFoundは、最初のセクションに行がない場合、行インデックスとして使用できます。うまくいけば、これはUITableViewControllerに配置される汎用関数であるべきです:
-(void) scrollToTop
{
if ([self numberOfSectionsInTableView:self.tableView] > 0)
{
NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
}
IOS7では、画面全体のUITableViewおよびUIScrollViewコンポーネントは、デフォルトで、すべてを機能させるためにコンテンツとスクロールインジケーターのインセットを調整します。ただし、気づいたように、CGPointZeroは視覚的な「トップ」に移動するコンテンツオフセットを表しません。
代わりにこれを使用してください:
self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top);
ここでは、セクションまたは行があるかどうかを心配する必要はありません。また、テーブルビューに最初の行をターゲットにするように指示せず、非常に背の高いテーブルヘッダービューなどをすべて表示しなかった理由を疑問に思います。
これを試して:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
@Markus Johanssonから受け入れられた回答に基づいて、Swift=コードバージョン:
func scrollToTop() {
if (self.tableView.numberOfSections > 0 ) {
let top = NSIndexPath(row: Foundation.NSNotFound, section: 0)
self.tableView.scrollToRow(at: top as IndexPath, at: .top, animated: true);
}
}
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.sampleTableView.scrollToRowAtIndexPath(indexPath,
atScrollPosition: UITableViewScrollPosition.Top, animated: true)
または
self.sampleTableView.setContentOffset(CGPoint.zero, animated:false)
IdStarの answer in updated Swift 3構文:
self.tableView.contentOffset = CGPoint(x: 0, y: 0 - self.tableView.contentInset.top)
アニメーションあり:
self.tableView.setContentOffset(CGPoint(x: 0, y: 0 - self.tableView.contentInset.top), animated: true)
スイフト3
テーブルビューヘッダーがある場合、CGPointZeroが機能しない可能性がありますが、これは常に上にスクロールするトリックです。
self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
_float systemVersion= [[[UIDevice currentDevice] systemVersion] floatValue];
if(systemVersion >= 7.0f)
{
self.edgesForExtendedLayout=UIRectEdgeNone;
}
_
viewDidLoad()
メソッドでこのコードを試してください。
私はこれが答えられたことに気付きましたが、私は別のオプションを与えたかっただけです:
CGRect frame = {{0, 0},{1, 1}};
[self.tableView scrollRectToVisible:frame animated:YES];
これにより、UITableViewが常に上部にスクロールすることが保証されます。受け入れられた答え:
NSIndexPath* top = [NSIndexPath indexPathForRow:NSNotFound inSection:0];
[self.tableView scrollToRowAtIndexPath:top atScrollPosition:UITableViewScrollPositionTop animated:YES];
セルではなくtableHeaderViewにスクロールしていたため、私にとってはうまくいきませんでした。
scrollRectToVisible
の使用は、iOS 6および7で機能します。
scrollToRowAtIndexPath:
を引き続き使用できます
Swift 4 UITableViewExtension:
func scrollToTop(animated: Bool) {
if numberOfSections > 0 {
let topIndexPath = IndexPath(row: NSNotFound, section: 0)
scrollToRow(at: topIndexPath, at: .top, animated: animated)
}
}
in Swift私が使用したもの:
self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)
@Alvin Georgeの作品は素晴らしい