web-dev-qa-db-ja.com

iOS 7(iPad)で静的テーブルビューセルの背景色を変更できない

IPadデバイスで実行している場合、iOS 7で静的UITableViewCellsの背景色を変更できません。これは、次のセットアップで簡単に確認できます。

  • 2つのストーリーボードを使用して、Xcode 5で新しいユニバーサルプロジェクトを作成します。
  • 各ストーリーボードに、1つのコントローラー(Table View Controller)のみを配置し、それを初期コントローラーとして設定します。
  • コントローラー/ストーリーボードの両方のテーブルビューにいくつかの(たとえば3)静的セルを配置します。
  • Interface Builderで各静的セルの背景色を異なる色に設定します(私は赤、緑、クリアな色を使用しています)。

次に、iPhoneおよびiPadシミュレーター(iOS 7)でアプリを実行します。

IPhoneシミュレーターでは、すべて問題ありません。
iPadシミュレーターでは、すべてのセルが白色になります。

Interface Builderでセルのランタイムプロパティを設定することにより、iPadを強制的に正しく動作させようとしました。

  • backgroundColorは色をクリアします
  • contentView.backgroundColorは色をクリアします
  • backgroundViewからnil

しかし、何も助けません。実際、contentView.backgroundColorの実行時プロパティを設定するとセルの色が変わりますが、クリアカラーでは機能しません(つまり、背後に別のビューが白で表示されます)。

同じバージョンのiOS上の2つのデバイスが異なる結果を生成することは非常に奇妙です。他の誰かがこのバグを確認できますか?

誰かがこの問題の解決策を持っていますか、または唯一の方法は動的プロパティを使用し、cellForRowAtIndexPathに色を設定することですか?問題の性質は静的であるため、静的セルを使用したいと思います。

追伸backgroundView.backgroundColorランタイムプロパティをクリアな色に設定しようとするのを忘れたことに気付いたのですが、現時点ではMacにアクセスできません。たぶんそれでうまくいくでしょう。

37
Kovasandra

これを行う:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
     UIImage *pattern = [UIImage imageNamed:@"image.png"];
     [cell setBackgroundColor:[UIColor colorWithPatternImage:pattern]];  
}

IOS7で私のために働く

57
fabrizotus

Appleのドキュメント によると:

定義済みのセルを使用する場合でも、カスタムセルを使用する場合でも、backgroundViewプロパティを使用するか、継承されたbackgroundColorプロパティを変更することにより、セルの背景を変更できます。 iOS 7では、デフォルトでセルの背景が白になります。 iOSの以前のバージョンでは、セルは囲んでいるテーブルビューの背景色を継承します。セルの背景色を変更する場合は、Table View DelegateのtableView:willDisplayCell:forRowAtIndexPath:メソッドで変更します。

したがって、tableView:cellForRowAtIndexPath:でどの色を設定しても、iOS 7は後でそれを白に変更します。 tableView:willDisplayCell:forRowAtIndexPath:に設定するだけです。私のために完璧に働いた。

10
Chex

代わりにContentViewの背景色を変更すると、機能します。

1
HeavenlyManBR

セルの背景色をオーバーライドするはるかに簡単な方法があります。 UITableViewCellをサブクラス化し、静的テーブルビューセルのクラスとして設定します。次にオーバーライドします:

-(void) willMoveToSuperview:(UIView *)newSuperview  {
    self.backgroundColor = [UIColor ...];
}

ここで、[UIColor ...] =必要な色(例:[UIColor clearColor]など);

1
middleseatman

この問題を修正できる唯一の方法は、ストーリーボードを使用する代わりにプログラムでテーブルを作成することでした。参考のために、ソリューションを投稿します。誰にも役立つことを願っています。

Uitableviewcontrollerをuiviewcontrollerに置き換えました。

次にこれを追加しました:

ヘッダーファイル

#import <UIKit/UIKit.h>

@interface LtHomeViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
{
NSArray *mFiles;
NSArray *mPics;
}

@end

そしてモジュールファイル

#import "LtHomeViewController.h"
#import "LtHomeToolbar.h"
#import "LtHomeCustomCell.h"

@interface LtHomeViewController () <LtHomeToolbarDelegate>

@end

@implementation LtHomeViewController
{
LtHomeToolbar *mainToolbar;
UITableView *theListView;
}

#define TOOLBAR_HEIGHT 64.0f

-(UIStatusBarStyle)preferredStatusBarStyle{
 return UIStatusBarStyleLightContent;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

CGRect toolbarRect = self.view.bounds; // View controller's view bounds
toolbarRect.size.height = TOOLBAR_HEIGHT;

mainToolbar = [[LtHomeToolbar alloc] initWithFrame:toolbarRect]; // At top
mainToolbar.delegate = self;

[self.view addSubview:mainToolbar];

//
mFiles = [[NSArray alloc] initWithObjects:@"../Lumina.app/lumina0.pdf", @"../Lumina.app/lumina8.pdf", @"../Lumina.app/lumina9.pdf", @"../Lumina.app/lumina10.pdf", nil];
mPics = [[NSArray alloc] initWithObjects:@"vol0.jpg", @"vol8.jpg", @"vol9.jpg", @"vol10.jpg", nil];
//
CGRect tableViewFrame = self.view.bounds;
tableViewFrame.Origin.y = TOOLBAR_HEIGHT;
tableViewFrame.size.height = self.view.bounds.size.height - TOOLBAR_HEIGHT;

theListView = [[UITableView alloc] initWithFrame:tableViewFrame style:UITableViewStylePlain];
theListView.delegate = self;
theListView.dataSource = self;

theListView.backgroundColor = [UIColor colorWithRed:(116/255.0) green:(167/255.0) blue:(179/255.0) alpha:1.0];


[self.view addSubview:theListView];
}

#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView
{
   return 1;
}

- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section
{
   return [mFiles count];
}

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *cellIdentifier = @"HomeCell";

   // Similar to UITableViewCell, but
   LtHomeCustomCell *cell = (LtHomeCustomCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
  if (cell == nil) {
    cell = [[LtHomeCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
  }

cell.image.image = [UIImage imageNamed:[mPics objectAtIndex:indexPath.row]];

NSString *magName = [[mFiles objectAtIndex:indexPath.row]stringByReplacingOccurrencesOfString:@"../Lumina.app/" withString:@""];
magName = [magName stringByReplacingOccurrencesOfString:@"lumina" withString:@""];
magName = [magName stringByReplacingOccurrencesOfString:@".pdf" withString:@""];
magName = [[@"Triathlon LUMINA " stringByAppendingString:magName]stringByAppendingString:@"号"];

cell.descriptionLabel.text = magName;

return cell;
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor colorWithRed:(116/255.0) green:(167/255.0) blue:(179/255.0) alpha:1.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return 110;
}

#pragma mark - UITableViewDelegate
- (void)tableView:(UITableView *)theTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
}


@end

今、この行だけがあなたに役立つかどうかはわかりませんが、より多くのものが必要なので、手動でテーブルを作成するアプローチを取りました

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    cell.backgroundColor = [UIColor colorWithRed:(116/255.0) green:(167/255.0) blue:(179/255.0) alpha:1.0];
}

デビッド

1
David

この行を書くだけです

[cell setBackgroundColor:[UIColor clearColor]];

returnステートメントの前の関数内

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

IOS7のドキュメントでは、各テーブルセルのデフォルトの色は白であると明確に述べられているためです。したがって、変更する場合は、コードから変更する必要があります。 [ユーティリティ]> [属性インスペクター](右側)から、tableviewの色をクリアするように背景プロパティを設定することを忘れないでください。

それが役立つことを願っています...それが私のために働いたように...!

0
eagle