Простой стиль UITableView для iPhone с пользовательским фоновым изображением - сделано “полностью” в коде
-
08-07-2019 - |
Вопрос
Я побывал повсюду, кажется, самый лучший 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]
.