Простой стиль UITableView для iPhone с пользовательским фоновым изображением - сделано “полностью” в коде

StackOverflow https://stackoverflow.com/questions/1637738

Вопрос

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

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

Это было полезно?

Решение

Вам нужно настроить свой контроллер как 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

Другие советы

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

Хорошо, теперь он запущен:) Мой TableView не был заполнен моими ячейками, поэтому, просмотрев то, что я обнаружил что, несмотря на то, что я реализовал TableViewDataSource и TableViewDelegate , это было только в главном представлении, мне нужно было установить для делегата и источника данных tableview значение = self .Для других, ищущих ответ на этот вопрос, вот метод в том виде, в каком он появился в Coneybeares help:

- (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;

}

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

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

}

//commit edit, didSelectRow, память ... и т.д.

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

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

    [self.view sendSubviewToBack:imageView];

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top