web-dev-qa-db-ja.com

IOS7 UITableViewでトップにスクロールする方法は?

IOS6では、UITableViewの上部にスクロールする次のコードがあります

[tableView setContentOffset:CGPointZero animated:YES];

IOS7では、これはもう機能しません。テーブルビューは完全に上部までスクロールされません(ただし、ほとんど)。

43

ここの他のいくつかの回答からの助けによって、私はそれをうまく機能させることができました。クラッシュを避けるために、まずいくつかのセクションがあることを確認する必要があります。 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];
    }
}
17

IOS7では、画面全体のUITableViewおよびUIScrollViewコンポーネントは、デフォルトで、すべてを機能させるためにコンテンツとスクロールインジケーターのインセットを調整します。ただし、気づいたように、CGPointZeroは視覚的な「トップ」に移動するコンテンツオフセットを表しません。

代わりにこれを使用してください:

self.tableView.contentOffset = CGPointMake(0, 0 - self.tableView.contentInset.top);

ここでは、セクションまたは行があるかどうかを心配する必要はありません。また、テーブルビューに最初の行をターゲットにするように指示せず、非常に背の高いテーブルヘッダービューなどをすべて表示しなかった理由を疑問に思います。

127
idStar

これを試して:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
[tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
23
Harikrishnan

@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);
    }
}
22
cashmash
var indexPath = NSIndexPath(forRow: 0, inSection: 0)
self.sampleTableView.scrollToRowAtIndexPath(indexPath,
atScrollPosition: UITableViewScrollPosition.Top, animated: true)

または

self.sampleTableView.setContentOffset(CGPoint.zero, animated:false)
4
A.G

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
DerFlickschter

スイフト3

テーブルビューヘッダーがある場合、CGPointZeroが機能しない可能性がありますが、これは常に上にスクロールするトリックです。

self.tableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: UITableViewScrollPosition.top, animated: false)
3
RiceAndBytes
_float systemVersion= [[[UIDevice currentDevice] systemVersion] floatValue];

if(systemVersion >= 7.0f)
{
  self.edgesForExtendedLayout=UIRectEdgeNone;   
}
_

viewDidLoad()メソッドでこのコードを試してください。

3
Jitendra

私はこれが答えられたことに気付きましたが、私は別のオプションを与えたかっただけです:

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で機能します。

2
Chris

scrollToRowAtIndexPath:を引き続き使用できます

2
Lithu T.V

Swift 4 UITableViewExtension:

func scrollToTop(animated: Bool) {
    if numberOfSections > 0 {
        let topIndexPath = IndexPath(row: NSNotFound, section: 0)
        scrollToRow(at: topIndexPath, at: .top, animated: animated)
    }
}
1
Sunkas

in Swift私が使用したもの:

self.tableView.setContentOffset(CGPointMake(0, 0), animated: true)

@Alvin Georgeの作品は素晴らしい

0
SpyZip