9

私はこのようなものを実装する必要があります:

NavBarはトップに留まり、tableViewはバウンスします

tableViewはバウンスする必要がありますが、ナビゲーションバーはバウンスできません。

さまざまなバリエーションを試しました。このようなもの:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGRect imageViewFrame = self.imageView.frame;
    CGRect tableViewFrame = self.tableView.frame;
    //ImageView - is top view(instead of NavBar)
    //defaultHeight - is default height of tableView
    imageViewFrame.origin.y = MIN(0, MAX(-scrollView.contentOffset.y, -100));
    tableViewFrame.origin.y = imageViewFrame.origin.y + 100;
    tableViewFrame.size.height = defaultHeight - imageViewFrame.origin.y;

    self.imageView.frame = imageViewFrame;
    self.tableView.frame = tableViewFrame;
}

これを取れ:

1 2

InstagramではtableViewのサイズが変わらないため、適切ではありません(スクロールインジケーターを見てください。tableViewのサイズが変更された場合は、それらも変更されます)

スクロールインジケーターをご覧ください スクロールインジケーターをご覧ください

また、ViewをsubViewとしてtableViewに追加しようとしましたが、機能しますが、正確には必要なものではありません。tableViewの外にあるInstagramのナビゲーションバーでは、それも適していません。

Facebookアプリでは、検索バーはまったく同じように動作します

ここに画像の説明を入力してください

誰か助けてもらえますか?

ありがとう!

4

4 に答える 4

1

iOS 5以降をターゲットにしている場合は、次のようにナビゲーションバーを簡単にカスタマイズできます。

1-UINavigationController内にTableViewControllerを追加します

2-ナビゲーションバーをカスタマイズします。

ナビゲーションバーの背景画像を設定する

[[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"bar_background"] 
                                   forBarMetrics:UIBarMetricsDefault];

右側に更新ボタンを追加

UIImage *img = [UIImage imageNamed:@"refresh.png"];
UIButton *rButton = [UIButton buttonWithType:UIButtonTypeCustom];
[rButton setImage:img forState:UIControlStateNormal];
[rButton addTarget:vc action:@selector(didTapRefreshButton:) forControlEvents:UIControlEventTouchUpInside];
rButton.frame = CGRectMake(0.0f, 0.0f, img.size.width, img.size.height);
UIBarButtonItem *rButtonItem = [[UIBarButtonItem alloc] initWithCustomView:rButton];

self.navigationItem.rightBarButtonItem = rButtonItem;
[rButtonItem release];

お役に立てば幸いです。

于 2013-03-13T05:17:23.497 に答える
1

サンプルコードでも同じアプローチを使用しますが、テーブルビューの高さを増やすのではなく、追加の(非表示の高さ)をプリロードし、フレームのyを減らして上に移動します。追加の高さは画面外になります。コンテンツの高さが画面外に出るほど大きくない場合は、画面外の高さにする必要はありません。

開始時に高さ=0のヘッダーを追加します。下にスクロールすると、サイズが最大100まで大きくなります(空のヘッダーは画面外に表示されます)。そうすれば、スクロールしてもコンテンツが途切れることはありません。

于 2013-03-12T22:28:59.440 に答える
1

Instagramの「ナビゲーションバー」はナビゲーションバーではありません。これはテーブルセクションのヘッダーです。写真をタップすると、ナビゲーションバー全体がスライドして離れます。これは、テーブルビューコントローラーの一部であり、「実際の」ナビゲーションバーではないためです。

これは、UINavigationControllerを使用し、ナビゲーションバーを非表示にすることで実現できます(setNavigationBarHidden:YES)。プッシュする場合は、pushViewController:animated:を手動で呼び出すだけです。

興味深いことに、Instagramの他のタブは通常のナビゲーションバーを使用しているように見え、特別なことは何もしていません。彼らは本当にそれらの44ポイントをメインフィード画面に戻したいと思っていたと思います。

于 2013-03-12T21:35:36.960 に答える
0

Instagramのようにナビゲーションバーに効果を追加したいクラスで、以下のメソッドを使用できます。

        - (void)scrollViewDidScroll:(UIScrollView *)sender {
//Initializing the views and the new frame sizes.
UINavigationBar *navbar =self.navigationController.navigationBar;
UIView *tableView = self.view;
CGRect navBarFrame = self.navigationController.navigationBar.frame;

CGRect tableFrame = self.view.frame;

//changing the origin.y based on the current scroll view.
//Adding +20 for the Status Bar since the offset is tied into that.

if (isiOS7) {
     navBarFrame.origin.y = MIN(0, MAX(-44, (sender.contentOffset.y * -1)))  +20 ;
     tableFrame.origin.y = navBarFrame.origin.y + navBarFrame.size.height;
}else{
    navBarFrame.origin.y = MIN(0, (sender.contentOffset.y * -1)) +20;
    tableFrame.origin.y = MIN(0,MAX(-44,(sender.contentOffset.y * -1))) ;
}

navbar.frame = navBarFrame;
tableView.frame = tableFrame;

}
于 2014-04-02T13:33:57.970 に答える