24

で、のヘッダービューとしてviewWillAppear追加しました。ビューが読み込まれると、contentOffSetofを使用して非表示になります。ユーザーがテーブルビューをプルダウンすると、検索バーが表示されます。UISearchBarUITableViewUISearchbarUINavigationBarUITableView

ヘッダービューを追加した後、以下のコードを使用して非表示にします。

self.tableView.contentOffset = CGPointMake(0, 40); //My searhbar height is 40

しかし、時にはcontentOffSetヘッダービューを隠していません。何が間違いなのか。

4

15 に答える 15

37

これは私のために働いた:

// contentOffset will not change before the main runloop ends without queueing it, for iPad that is
dispatch_async(dispatch_get_main_queue(), ^{
    // The search bar is hidden when the view becomes visible the first time
    self.tableView.contentOffset = CGPointMake(0, CGRectGetHeight(self.searchBar.bounds));
});

-viewDidLoad または -viewWillAppear に入れてください

于 2014-04-25T22:40:14.473 に答える
19

以前のバージョンの iOS SDK ではviewWillAppear、メイン スレッドで実行されていた などのメソッドがバックグラウンド スレッドで実行されるようになったため、この問題が発生しています。

ほとんどのコールバックはバックグラウンド スレッドで発生する傾向があるため、UI 呼び出しを行うときは常にスレッド セーフを確認してください。

メイン スレッドのコンテンツ オフセットへの変更をディスパッチします。

オブジェクティブ C

dispatch_async(dispatch_get_main_queue(), ^{
    CGPoint offset = CGPointMake(0, self.searchBar.bounds.height)
    [self.tableView setContentOffset:offset animated:NO];
});

スイフト3

DispatchQueue.main.async {
            let offset = CGPoint.init(x: 0, y: self.searchBar.bounds.height)
            self.tableView.setContentOffset(offset, animated: false)
        }
于 2016-10-17T01:44:32.553 に答える
2

1 時間のテストの後、100% 機能する唯一の方法は次のとおりです。

-(void)hideSearchBar
{
    if([self.tableSearchBar.text length]<=0 && !self.tableSearchBar.isFirstResponder)
    {
        self.tableView.contentOffset = CGPointMake(0, self.tableSearchBar.bounds.size.height);
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

-(void)viewDidLayoutSubviews
{
    [self hideSearchBar];
}

このアプローチでは、空の場合はいつでも検索バーを非表示にできます

于 2015-04-10T10:36:50.387 に答える
0

テーブルをスクロールするときは、自分で検索バーを非表示にする必要があります。UITableViewしたがって、ヘッダーとして配置しないでください。高さをゼロに設定することで非表示にできます。そうすれば、テーブルビューが自動サイズ変更に設定されている場合、テーブルビューは拡張されます。

于 2013-03-05T11:18:04.100 に答える
0

テーブルに常に少なくとも 1 つの行がある場合は、テーブルの最初の行までスクロールすると、検索バーが自動的に非表示になります。

let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)

self.tableView.selectRowAtIndexPath(firstIndexPath、アニメーション: false、scrollPosition: .Top)

上記のコードをviewDidLoadに配置すると、 tableViewがまだロードされていないためエラーがスローされます。

viewDidAppearに配置すると、tableView を開くたびに上部にスクロールします。

UITabBar ビュー コントローラーの場合や、セグエを実行してから戻ってきた場合など、tableView が開いたままの場合は、この動作が望ましくない場合があります。初期ロード時に一番上までスクロールしたい場合は、最初のロードかどうかを確認する変数を作成して、一度だけ一番上までスクロールするようにします。

まず、View Controller クラスで isInitialLoad という変数を定義し、「true」に設定します。

var isInitialLoad = true

次に、 viewDidAppearでisInitialLoad が true かどうかを確認し、true の場合は、一番上までスクロールして isInitialLoad 変数を false に設定します。

if isInitialLoad {
    let firstIndexPath = NSIndexPath(forRow: 0, inSection: 0)
    self.tableView.selectRowAtIndexPath(firstIndexPath, animated: false, scrollPosition: .Top)
    isInitialLoad = false
}
于 2015-12-16T21:22:00.367 に答える
0

検索バーのサイズに問題がある可能性があります。次のコード行を試してください。

[searchBar sizeToFit];
于 2013-03-06T08:58:42.427 に答える
0

問題は自動マスキングです。テーブルを選択し、下の画像のようにすべての行が選択されていることを確認してください。

ここに画像の説明を入力

于 2013-03-05T12:30:24.647 に答える
0

コード行は正常に機能しています。

contentOffsetの説明UITableView:

たとえば、高さ 100 のテーブル ビューがあるとします。そのコンテンツはビューのビューよりも大きい場合があります (たとえば 150) contentOffset。たとえばcontentOffset = (0, 40)、コンテンツは高さの 40 後に表示されます。

注: コンテンツがスクロールされると、以前に設定された の影響はありませんcontentOffset

于 2014-06-25T08:18:25.387 に答える
-3
self.tableView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height -80, 0, 0, 0);
于 2015-05-12T18:43:17.510 に答える