Ответ 1
Начиная с iOS 7, вы можете изменить это, изменив представление в виде таблицы.
[self.tableView setBackgroundView:view];
сделайте цвет фона представления таким же, как цвет вашего родительского представления.
Приложения Apple iPhone, такие как Music и Contants, используют панель поиска в UITableView. При прокрутке вниз, чтобы панель поиска перемещалась вниз, пустое пространство над содержимым вида прокрутки имеет светло-серый цвет фона (см. Снимок экрана).
(Обратите внимание, что строка поиска имеет чуть более темную линию края вверху. Этого нет для UISearchBar по умолчанию, но подкласс должен позаботиться об этом.)
Я попытался установить фоновый цвет UITableView, но это также влияет на строки. Кто-нибудь знает, как добиться этого эффекта? Должен ли я переопределить реализацию drawRect: или есть встроенный способ?
Начиная с iOS 7, вы можете изменить это, изменив представление в виде таблицы.
[self.tableView setBackgroundView:view];
сделайте цвет фона представления таким же, как цвет вашего родительского представления.
Настройка прозрачности плохо для производительности. То, что вы хотите, - это серая область над панелью поиска, но она должна оставаться белой за пределами списка.
Вы можете добавить subview к вашему UITableView
, который живет выше содержимого.
CGRect frame = self.list.bounds;
frame.origin.y = -frame.size.height;
UIView* grayView = [[UIView alloc] initWithFrame:frame];
grayView.backgroundColor = [UIColor grayColor];
[self.listView addSubview:grayView];
[grayView release];
Вы могли бы добавить более интересные вещи в представление, если хотите, возможно, затухание или разделительную линию без подкласса UISearchBar
.
Это один из моих самых любимых трюков.
UIView *topview = [[[UIView alloc] initWithFrame:CGRectMake(0,-480,320,480)] autorelease];
topview.backgroundColor = [UIColor colorWithRed:226.0/255.0 green:231.0/255.0 blue:238.0/255.0 alpha:1];
[self.tableView addSubview:topview];
В основном вы создаете большой вид размера экрана и помещаете его "выше" в область содержимого. Вы никогда не сможете прокручивать его.
И не беспокойтесь о влиянии UIView на память на 320x480 пикселей, он не будет потреблять значительную память, потому что у CALayer нет никакого содержательного контента.
Чтобы увеличить на предложение HusseinB:
Swift 3
let bgView = UIView()
bgView.backgroundColor = UIColor.white
self.tableView.backgroundView = bgView
Цель C
UIView *bgView = [UIView new];
bgView.backgroundColor = [UIColor whiteColor];
[self.tableView setBackgroundView:bgView];
В Swift (проверен на iOS9)
let backView = UIView(frame: self.tableView.bounds)
backView.backgroundColor = UIColor.clearColor() // or whatever color
self.tableView.backgroundView = backView
Этот код работает в Swift fot UITableView
:
var frame = self.tableView.bounds
frame.origin.y = -frame.size.height
frame.size.height = frame.size.height
frame.size.width = UIScreen.mainScreen().bounds.size.width
let blueView = UIView(frame: frame)
blueView.backgroundColor = UIColor.headerBlueColor()
self.tableView.addSubview(blueView)
Я нашел только один способ сделать это. Вы должны установить, что backgroundColor UITableView прозрачен, установите backgroundColor содержимого cellView в любой цвет, который вы хотите, чтобы фактические ячейки были, а затем важно, чтобы вы получили светло-серый цвет, появляющийся за UITableView. Этот последний шаг вы можете сделать, установив backgroundColour из UIWindow или того, что содержится, или вашего TableViewController.
Итак, предполагая, что у вас есть контроллер вида, который получен из UITableViewController, вставьте эти строки в метод - (void) viewDidLoad: -
// sets the background of the table to be transparent
self.tableView.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.0];
// assuming we are inside a navigation or tab controller, set the background
self.parentViewController.view.backgroundColor = [UIColor lightGrayColor];
Затем внутри части таблицыView: cellForRowAtIndexPath: создает новые ячейки, добавляет: -
// set an opaque background for the cells
cell.contentView.backgroundColor = [UIColor whiteColor];
Я сам столкнулся с этой проблемой и нашел решение.
Я использовал Spark Inspector, чтобы изучить макет табличного представления - что действительно помогло.
Дело в том, что в этом случае UITableView имеет 3 подзаголовка:
UITableViewWrapperView
UIView
- С backgroundColor
установлен светлый серый цветUISearchBar
Пока вы перемещаете содержимое таблицы вниз, вторая высота подвыбора динамически увеличивается, чтобы заполнить пробел между началом UITableViewWrapperView
и UITableView
.
Настройка свойства backgroundColor
или backgroundView
не повлияет на 2-й подзаголовок.
Что вам нужно сделать, это найти второй вид и изменить его цвет, например:
if (_tableView.subviews.count > 1) {
_tableView.subviews[1].backgroundColor = THE_TARGET_COLOR;
}
В моем случае мне нужно, чтобы все представления были белыми, поэтому я использовал следующее, которое менее подвержено будущим изменениям иерархии представления UITableView
со стороны Apple:
for (UIView *subview in _tableView.subviews) {
subview.backgroundColor = [UIColor whiteColor];
}
Я дам вам лучший способ сделать это.
Сначала установите цвет фона в виде таблицы так, как вы хотите, в построителе интерфейса.
Затем ответьте на метод делегата UITableView tableView:willDisplayCell:ForIndexPath:
как это
- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCelll*)cell forIndexPath:(NSINdexPath*)indexPath
{
[cell setBackgroundColor:[UIColor whiteColor]];
}
Другой метод:
в методе ViewDidLoad
(или где угодно) установите цвет фона tableView
для очистки цвета следующим образом:
self.tableView.backgroundColor = [UIColor clearColor];
а затем установите цвет супервизора в белый цвет
self.tableView.superview.backgroundColor = [UIColor whiteColor];
Самый простой способ создать разные цвета в нижней части и в верхней части области перегиба табличного представления - установить ключ tableHeaderBackgroundColor в представлении таблицы. Таким образом вы устанавливаете верхний цвет. Я не уверен, но, возможно, есть еще один ключ для нижнего колонтитула, взгляните. Если вы ничего не нашли, вам просто нужно установить фон в виде таблицы с цветом, который вы хотите показать внизу. Выше вы можете увидеть пример кода:
self.table.setValue(UIColor.blue , forKey: "tableHeaderBackgroundColor")
Надеюсь, это поможет вам. Если да, пусть другие люди знают об этом легком пути, давая ответ в ответ:)
Я не думаю, что вы хотите переопределить drawRect. Скорее всего, то, что вы видите, это цвет фона другого вида или окна, которое находится "за" (т.е. Является просмотром) представления таблицы. Как правило, довольно сложные слои UIViews в виджетах пользовательского интерфейса Apple. Изучите иерархию представлений в GDB, посмотрите на [myView superview], а затем на subviews [someSuperView] и попробуйте манипулировать их цветами BG в отладчике, чтобы узнать, можете ли вы найти, какой из них он есть. Однако, если вы реализуете исправление таким образом, будьте предупреждены о том, что он не может быть совместим с будущим.
Вы также можете попробовать установить цвет BG одного из представлений за табличным представлением в Interface Builder (или самого окна).
Если вы используете tableviewcell, вы можете установить, что фон представления непрозрачен белым цветом. Затем используйте
self.tableView.backgroundColor = [UIColor grayColor];
в режиме просмотра был загружен метод.
Я уверен, что это [UITableView backgroundColor]. Вы затронули строки, потому что строки имеют backgroundColor == clear (или полупрозрачные). Итак, если вы сделаете строки непрозрачными, все будет работать нормально. Это будет решение.
Я следил за кончиком, обозначенным Peylow, для UITableView, просто добавив subview. Мое единственное изменение в коде заключалось в том, чтобы захватить цвет немного ближе к тому, который использовался в приложениях Apple, и я немного приблизился к тому, как Apple выглядел над линией над UISearchbar, уменьшив координату начала координат y на один пиксель:
frame.origin.y = -frame.size.height - 1
Для тех, кто задается вопросом, как сделать то же самое для нижней области отказов:
Сначала добавьте subview с желаемым фонового цвета в фоновое представление таблицы:
self.bottomView = [[UIView alloc] initWithFrame:CGRectOffset(self.tableView.frame, 0, self.tableView.frame.size.height)];
self.bottomView.backgroundColor = whateverColorYouLike;
[self.tableView.backgroundView addSubview:self.bottomView];
И затем в вашем представлении представления таблицы:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect frame = self.bottomView.frame;
frame.origin.y = self.tableView.contentSize.height - self.tableView.contentOffset.y;
self.bottomView.frame = frame;
}