iPhone UITableView PlainStyle с пользовательским фоновым изображением - сделано «полностью» в коде - PullRequest
7 голосов
/ 28 октября 2009

Я был повсюду, кажется, что 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, но в табличном представлении PlainStyle :) .. и выполнено с использованием кода, а не IB.

Полагаю, мне нужно очистить цвет фона табличного представления, а затем установить цвет ячеек при их настройке, чтобы они не выглядели прозрачными. А потом каким-то образом «подкрасться» фоновое изображение под представлением tableView из экземпляра tableView?

Как мне поступить, лучшее решение было бы сделать это в viewDidLoad или любой другой функции внутри моего TableViewController, чтобы хранить все мои настройки в одном месте.

Надеюсь, кто-нибудь может мне помочь, я все "погуглил" :) Спасибо!

Ответы [ 5 ]

9 голосов
/ 28 октября 2009

Вам необходимо настроить контроллер как 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
6 голосов
/ 14 апреля 2012

Все эти прыжки через обручи не нужны, если вы нацеливаетесь на> 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;
}  
2 голосов
/ 28 октября 2009

Хорошо, теперь он работает :) Мой 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;

}

0 голосов
/ 05 марта 2012

Несколько советов:

  • При использовании UISplitViewController:

    splitViewController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • При использовании UINavigationController:

    navigationController.view.backgroundColor = [UIColor scrollViewTexturedBackgroundColor];
    
  • При использовании UISplitViewController и UINavigationController:

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

Обязательно установите цвет фона любого UIView, который вы хотите видеть сквозь, сверху UINavigationController или UISplitViewController до [UIColor clearColor].

0 голосов
/ 28 октября 2009

Спасибо Coneybeare.

Он больше не падает, а фоновое изображение получается просто идеальным (вместе с моим навигационным контроллером вверху) Тем не менее, до сих пор нет видимого 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];

Надеюсь, я что-то упустил очевидное.

Спасибо за ваше время:)

...