7

我到处都是,似乎UITableView静态背景问题有据可查,但没有人提供直接的解决方案?我TableViews完全用代码构建我的,像这样:

    UIViewController *tableViewController = [[TableViewController alloc] init];
navigationController = [[UINavigationController alloc]
                        initWithRootViewController:tableViewController];
[tableViewController release];
[window addSubview:navigationController.view];

该窗口是我UIWindow在应用程序委托中为我构建的主要内容。从这里开始,我需要构建一些不同的TableViews(由 控制navigationController),一些带有fetchedResultsControllers,自定义单元等等。我更喜欢完全在代码中执行此操作,而不是使用 nib,因为这会导致在代码和 IB 之间进行自定义传播,或者必须构建和维护 6 个以上不同的 Nib。

我根本找不到一个tableViewController类设置它自己的背景图像的工作示例。如果我在我的一个TableViews(扩展UITableViewController)中执行此操作:

self.tableView.backgroundColor = backgroundColor;

当然,我将 tableView 的背景着色(顺便给单元格着色,认为单元格继承了它们的颜色tableView?)但我希望有一个静态背景图像,我的单元格在上面上下滑动。不是随着用户手势上下滑动的“背景图像”。正是 GroupedStyle tableView 提供的,但在 PlainStyle tableView 中:) .. 并使用代码而不是 IB 完成。

我想我必须清除表格视图的背景颜色,然后在配置它们时设置单元格颜色,这样它们就不会变成透明的。然后以某种方式从 tableView 实例内部“偷偷摸摸”在 tableView 视图下方的背景图像?

我将如何解决这个问题,最好的解决方案是能够在 viewDidLoad 或我的 TableViewController 中的任何其他函数中执行此操作,以将我的所有自定义设置保存在一个地方。

希望有人可以帮助我,我都“用谷歌搜索”了 :) 谢谢!

4

5 回答 5

9

您需要将控制器设置为UIViewController,而不是UITableViewController. 然后以tableview编程方式在背景上方添加imageView

@interface SomeController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
  ...
  UITableView *tableView;
  ...
}
@property (nonatomic, retain) UITableView *tableView;
@end



@implementation SomeController

@synthesize tableView;

...

- (void)loadView {
    [super loadView];
    UIImageView *v = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease];
    [v setImage:[UIImage imageNamed:@"table_background.png"]];
    [self.view addSubview:v];


    self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
    [self.tableView setBackgroundColor:[UIColor clearColor]];
    [self.view addSubview:self.tableView];
}
...
@end
于 2009-10-28T15:05:31.360 回答
6

如果您的目标是 > iOS 3.2,那么所有这些跳跃都是不必要的,您可以使用新的backgroundView属性直接设置 UIImageView,例如:

// In your UITableViewController subclass
- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.png"]];
    self.tableView.backgroundView = view;
}  
于 2012-04-14T12:07:00.013 回答
2

好的,现在它正在运行:) 我的 tableView 没有填充我的单元格,所以我发现即使我已经实现了 TableViewDataSource 和 TableViewDelegate,这只是在主视图中,我需要设置委托和 tableview 的数据源 = self. 对于其他寻求答案的人来说,这是最终得到 Coneybeares 帮助的方法:

- (void)loadView {
[super loadView];

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease];
[imageView setImage:[UIImage imageNamed:@"carbon_background.png"]];
[self.view addSubview:imageView];

[self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds] autorelease];
[self.tableView setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:self.tableView];

self.tableView.delegate = self;
self.tableView.dataSource = self;

}

于 2009-10-28T19:33:22.367 回答
0

谢谢康妮熊。

它不再崩溃,背景图像变得完美(连同顶部的导航控制器)但是,仍然没有可见的 tableView?只是背景图像和导航控制器栏:

这是我的实现:

- (void)loadView {
[super loadView];

UIImageView *imageView = [[[UIImageView alloc] initWithFrame:self.view.bounds] autorelease];
[imageView setImage:[UIImage imageNamed:@"carbon_background.png"]];
[self.view addSubview:imageView];

[self.tableView = [[UIView alloc] initWithFrame:self.view.bounds] autorelease];

[self.tableView setBackgroundColor:[UIColor clearColor]];
[self.view addSubview:self.tableView];

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)theTableView {
return 1;

}

- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section {
return 3;

}

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
cell.textLabel.text = @"Hello, World";

return cell;

}

//提交编辑、didSelectRow、内存……等。

论坛并没有一次性完成整个 .m 文件。请告诉我是否遗漏了可能有助于指示错误的内容。

我想也许这是层的顺序,但没有运气就尝试了这个:

    [self.view sendSubviewToBack:imageView];

希望我错过了一些明显的东西。

谢谢你的时间:)

于 2009-10-28T17:23:17.213 回答
0

一些技巧:

  • 如果使用UISplitViewController

    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • 如果使用UINavigationController

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • 如果同时使用 aUISplitViewController和 a UINavigationController

    navigationController.view.backgroundColor = [UIColor clearColor];
    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    

一定要设置任何UIView你想看穿的背景颜色,它位于UINavigationControllerUISplitViewController的顶部[UIColor clearColor]

于 2012-03-04T21:37:28.047 回答