54

Music や Contants などの Apple の iPhone アプリは、UITableView の検索バーを使用します。下にスクロールして検索バーを下に移動すると、スクロール ビューのコンテンツの上の空きスペースの背景色が明るい灰色になります (スクリーンショットを参照)。

薄い灰色の背景が表示されている連絡先アプリのスクリーンショット

(検索バーの上部に少し暗いエッジ ラインがあることに注意してください。これは既定の UISearchBar にはありませんが、サブクラス化で処理する必要があります。)

UITableView の背景色を設定してみましたが、行にも影響があります。この効果を達成する方法を知っている人はいますか?実装 drawRect: をオーバーライドする必要がありますか、それとも組み込みの方法がありますか?

4

16 に答える 16

39

透明度を設定すると、パフォーマンスが低下します。必要なのは検索バーの上の灰色の領域ですが、リストの最後を超えてもまだ白いはずです。

UITableView代わりに、コンテンツの上にあるサブビューを追加できます。

CGRect frame = self.list.bounds;
frame.origin.y = -frame.size.height;
UIView* grayView = [[UIView alloc] initWithFrame:frame];
grayView.backgroundColor = [UIColor grayColor];
[self.listView addSubview:grayView];
[grayView release];

必要に応じて、おそらくフェード、またはサブクラス化せずに分割線など、より凝ったものをビューに追加できますUISearchBar

于 2009-08-29T10:48:17.830 に答える
30

これは私の非常にお気に入りのトリックの 1 つです。

UIView *topview = [[[UIView alloc] initWithFrame:CGRectMake(0,-480,320,480)] autorelease];
topview.backgroundColor = [UIColor colorWithRed:226.0/255.0 green:231.0/255.0 blue:238.0/255.0 alpha:1];

[self.tableView addSubview:topview];

基本的に、画面サイズの大きなビューを作成し、コンテンツ領域の「上」に配置します。それを過ぎて上にスクロールすることはできません。

また、320x480 ピクセルの UIView のメモリへの影響について心配する必要はありません。CALayer には意味のあるコンテンツがないため、大量のメモリを消費することはありません。

注:「受け入れられた」回答が非常に単純な場合、この回答が関連するのはなぜですか? backgroundViewテーブルビューで設定しないのはなぜですか? 元の質問に示されている連絡先アプリの場合、テーブル ビューの「上」の領域は、テーブル ビューの「下」の領域 (白) とは異なる背景色 (水色) を持っているためです。この手法を使用すると、テーブル ビューの上下に 2 つの異なる色を表示できますが、これは単純な背景では実現できません。

編集 1/2018:コメントのトムが指摘したように、この回答はかなり古く、すべての iOS デバイスが同じ画面サイズであることを前提としています (クレイジーに思えますが、私がこれに回答したのは 2009 年でした)。ここで紹介する概念はまだ機能しますが、実際のUIScreen.main.bounds画面サイズを把握するために使用するか、いくつかの凝った自動レイアウトを使用することができます (提案を歓迎します)。通常、ビューのサイズは、コントローラーがサイズを変更した後のサイズであるとは限らないため、別の回答のように使用することはお勧めしません。0x0 から始まる場合もあります。tableView.boundsviewDidLoad

于 2009-09-28T01:28:55.963 に答える
23

iOS 7 以降では、テーブルビューの背景ビューを変更することでこれをいじることができます。

[self.tableView setBackgroundView:view];

ビューの背景色を親ビューの色と同じにします。

于 2014-04-30T10:33:55.560 に答える
9

このコードはSwift fotで動作しますUITableView:

var frame = self.tableView.bounds
frame.origin.y = -frame.size.height
frame.size.height = frame.size.height
frame.size.width = UIScreen.mainScreen().bounds.size.width
let blueView = UIView(frame: frame)
blueView.backgroundColor = UIColor.headerBlueColor()
self.tableView.addSubview(blueView)
于 2016-07-05T17:26:45.450 に答える
7

Swiftで( iOS9 でテスト済み)

    let backView = UIView(frame: self.tableView.bounds)
    backView.backgroundColor = UIColor.clearColor() // or whatever color
    self.tableView.backgroundView = backView
于 2015-10-02T14:36:34.077 に答える
4

これを行う方法を1つだけ見つけました。UITableView の backgroundColor を透明に設定し、セルの contentView の backgroundColor を実際のセルにしたい色に設定する必要があります。次に、UITableView の背後に明るい灰色を表示する必要があります。最後のステップは、UIWindow の backgroundColour を設定するか、または tableViewController を含むもののいずれかを設定することで実行できます。

したがって、UITableViewController から派生したビュー コントローラーがあると仮定すると、次の行を -(void)viewDidLoad メソッドに挿入します。

// sets the background of the table to be transparent
self.tableView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.0];
// assuming we are inside a navigation or tab controller, set the background
self.parentViewController.view.backgroundColor = [UIColor lightGrayColor];

次に、新しいセルを作成する tableView:cellForRowAtIndexPath: の部分内に、次を追加します。

// set an opaque background for the cells 
cell.contentView.backgroundColor = [UIColor whiteColor];
于 2009-08-04T22:58:07.743 に答える
4

私は自分でこの問題に遭遇し、解決策を見つけました。

原因

テーブル ビューのレイアウトを調べるためにSpark Inspectorを使用しましたが、これは非常に役に立ちました。

つまり、このシナリオでは、UITableView に 3 つのサブビューがあります。

  1. UITableViewWrapperView
  2. UIViewbackgroundColorライトグレー色に設定して
  3. UISearchBar

テーブルビューのコンテンツを下にスワイプすると、2 番目のサブビューの高さが動的に増加し、フレームの原点UITableViewWrapperViewとの間のスペースが埋められます。UITableView

解決

backgroundColororプロパティを設定してもbackgroundView、2 番目のサブビューには影響しません。必要なことは、次のように 2 番目のビューを見つけて、その色を変更することです。

if (_tableView.subviews.count > 1) {
    _tableView.subviews[1].backgroundColor = THE_TARGET_COLOR;
}

私の場合、すべてのビューを白くする必要があったためUITableView、Apple によるビュー階層の将来の変更の可能性が低い以下を使用しました。

for (UIView *subview in _tableView.subviews) {
    subview.backgroundColor = [UIColor whiteColor];
}
于 2014-03-27T09:45:04.410 に答える
0

サブビューを追加するだけで、UITableView について Peylow によって概説されたヒントに従いました。コードからの私の唯一の変更点は、Apple アプリで使用されている色に少し近い色を取得することでした。さらに、フレームの原点の y 座標を 1 ピクセル減らすことで、UISearchbar の上に線があるという Apple の外観に少し近づけました。

frame.origin.y = -frame.size.height - 1
于 2010-01-22T17:02:55.557 に答える
0

tableviewcell を使用している場合は、ビューの背景を不透明な白に設定できます。次に使用します

self.tableView.backgroundColor = [UIColor grayColor];

ビューでメソッドをロードしました。

于 2009-07-31T16:12:17.547 に答える
0

それはきっと【UITableView backgroundColor】だと思います。行に backgroundColor == clear (または半透明) があるため、影響を受けた行があります。したがって、行を不透明にすると、すべて正常に機能します。これで解決となります。

于 2009-07-31T16:18:52.417 に答える