iPhone UITableView PlainStyle с пользовательским фоновым изображением — полностью в коде

Я был повсюду, кажется, проблема UITableView со статическим фоном хорошо задокументирована, но никто не нашел прямого решения? Я строю свой TableViews полностью в коде, например:

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

Окно — это моя основная UIWindow сборка для меня в делегате приложения. С этого момента мне нужно построить несколько разных TableViews (управляемых navigationController), некоторые с fetchedResultsControllers, пользовательскими ячейками и так далее. Я предпочитаю делать это полностью в коде, не используя перья, так как это приведет либо к распространению настройки между кодом и IB, либо к необходимости создавать и поддерживать более 6 разных перьев.

Я просто не могу найти рабочий пример, где класс tableViewController устанавливает собственное фоновое изображение. Если я сделаю это внутри одного из моих TableViews (расширяя UITableViewController):

self.tableView.backgroundColor = backgroundColor;

Я, конечно, получаю цвет фона tableView (который, кстати, также окрашивает ячейку, думаю, ячейка наследует свой цвет от tableView?), но я хочу иметь статическое фоновое изображение, по которому мои ячейки скользят вверх и вниз. Не «фоновое изображение», которое скользит вверх и вниз с помощью жестов пользователя. Именно то, что предлагает GroupedStyle tableView, но в PlainStyle tableView :) .. и делается с использованием кода, а не IB.

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

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

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


person RickiG    schedule 28.10.2009    source источник


Ответы (5)


Вам нужно настроить контроллер как 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
person coneybeare    schedule 28.10.2009
comment
Спасибо Coneybeare, похоже, это следует логике, которую я видел в Nibs, которые включают пользовательское изображение, создают общее представление, помещают в него изображение и tableView. Я получаю какое-то странное поведение: / Я реализовал cellForRowAtIndexPath: и у него также есть локальная переменная с именем tableView. Это приводит к тому, что компилятор предупреждает, что локальное объявление tableView скрывает переменную экземпляра. Затем я попытался переименовать переменную в tableViewLocal, но предупреждение сохраняется. -Продолжать... - person RickiG; 28.10.2009
comment
Также при загрузке представления (как описано в моем вопросе) происходит сбой, когда я добавляю [self.tableView addSubview:self.tableView]; Разве это не должно быть: [self.view addSubview:self.tableView]; это компилируется и работает, но есть только фоновое изображение, без таблиц? Я думаю, что подход правильный, но я кое-что упускаю:) Спасибо еще раз:) - person RickiG; 28.10.2009
comment
Я бы изменил все аргументы tableView в сигнатурах методов на theTableView и оставил self.tableView как есть. Сбой был моей опечаткой, это должно было быть добавлено self.view… (сейчас исправлено) - person coneybeare; 28.10.2009
comment
self.tableView = [UIView alloc] должно быть self.tableView = [UITableView alloc]. Для меня этого было достаточно, чтобы исправить сбой. - person pm_labs; 31.05.2010

Все эти прыжки через обручи не нужны, если вы ориентируетесь на > 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;
}  
person voyce    schedule 14.04.2012

Хорошо, теперь он работает :) Мой tableView не был заполнен моими ячейками, поэтому, пройдя через breakPointing, я обнаружил, что, хотя я реализовал TableViewDataSource и TableViewDelegate, это было только в основном представлении, мне нужно было установить делегат и источник данных табличного представления = 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;

}

person RickiG    schedule 28.10.2009

Спасибо, Конибер.

Он больше не падает, и фоновое изображение выглядит просто идеально (вместе с моим навигационным контроллером в верхней части). Тем не менее, по-прежнему не видно tableView? только фоновое изображение и панель navigationControllerBar:

Это моя реализация:

- (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, memory … и т. д.

Форум не был готов для всего .m-файла за один раз. Пожалуйста, сообщите мне, если я упустил что-то, что может помочь указать на ошибку.

Я подумал, может быть, это был порядок слоев, и безуспешно попробовал это:

    [self.view sendSubviewToBack:imageView];

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

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

person RickiG    schedule 28.10.2009
comment
Только что понял :) self.tableView = [[[UIView alloc] initWithFrame:self.view.bounds] autorelease]; должно быть: self.tableView = [[[UITableView alloc] initWithFrame:self.view.bounds] autorelease]; Иначе не подойдет :) Еще раз спасибо! - person RickiG; 28.10.2009

Некоторые советы:

  • При использовании 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].

person Stian Høiland    schedule 04.03.2012