Вопрос по uisearchbar, iphone, uitableview, uikit – Светло-серый фон в «зоне отказов» UITableView

46

Приложения Apple для iPhone, такие как Music и Contants, используют панель поиска в UITableView. Когда вы прокручиваете страницу вниз так, что панель поиска перемещается вниз, пустое пространство над содержимым представления прокрутки имеет светло-серый цвет фона (см. Скриншот).

Screenshot of Contacts app showing light gray background

(Обратите внимание, что строка поиска имеет немного более темную линию края в верхней части. Этого не существует для UISearchBar по умолчанию, но подклассы должны позаботиться об этом.)

Я попытался установить цвет фона UITableView, но это также влияет на строки. Кто-нибудь знает, как добиться этого эффекта? Я собираюсь переопределить реализовать drawRect: или есть встроенный способ?

связанные с:stackoverflow.com/questions/1114587/… Jeff Atwood

Ваш Ответ

15   ответов
3


Сначала установите цвет фона табличного представления на тот, который вы хотите в конструкторе интерфейса.
Затем ответьте делегату UITableViewtableView:willDisplayCell:ForIndexPath: метод как это

- (void)tableView:(UITableView*)tableView willDisplayCell:(UITableViewCelll*)cell forIndexPath:(NSINdexPath*)indexPath
{
     [cell setBackgroundColor:[UIColor whiteColor]];
}


Другой метод:
вViewDidLoad метод (или где угодно) установитьtableView цвет фона, чтобы очистить цвет, как это:

self.tableView.backgroundColor = [UIColor clearColor];

а затем установите цвет superview на белый

self.tableView.superview.backgroundColor = [UIColor whiteColor];
Я согласен с тем, что установка backgroundColor в uitableview является наилучшим подходом - это влияет на область отскока во всех тестах, которые я провел. Для второго подхода self.tableView.superview является нулевым для uitableviewcontrollers, поэтому это не сработает для этого типа контроллера; Кроме того, я читал, что установка фонового цвета для uitableview в clearColor - плохая идея из-за заметного снижения производительности.
2
EASIEST SOLUTION

гающей области табличного представления - это установить ключtableHeaderBackgroundColor представления таблицы. Делая так, вы устанавливаете верхний цвет. Я не уверен, но, возможно, есть еще один ключ для нижнего колонтитула, посмотрите. Если вы ничего не нашли, вам просто нужно установить фон табличного представления таким цветом, который вы хотите показать внизу. Выше вы можете увидеть пример кода:

self.table.setValue(UIColor.blue , forKey: "tableHeaderBackgroundColor")

Надеюсь, это поможет вам. Если да, пусть другие люди узнают об этом простом способе отказаться от ответа :)

@Emil Хорошо, я уже отправил по крайней мере 3 приложения, использующих этот ключ, и у меня не было никаких проблем. В любом случае, вы также можете поместить UIView с нужным фоном в «представление фона». таблицы, и это решит проблему.
Может быть, вы хотите добавитьself.tableView.backgroundColor=bottomColor; на ваш код ответа, чтобы люди имели оба в одном. Я использую только эту смесь, и она отлично работает для меня, ура
это не публичная собственность, приложение может быть отклонено, если подано с этим
0

кто интересуется, как сделать то же самое для нижней области отскока:

Сначала добавьте подпредставление с желаемым цветом фона в фоновое представление представления таблицы:

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;
}
1

что вы хотите переопределить drawRect. Скорее всего, то, что вы видите, - это цвет фона другого вида или окна, которое находится "позади". (т.е. является супервизором) табличного представления. Обычно в виджетах пользовательского интерфейса Apple довольно сложные слои UIViews. Изучите иерархию представлений в GDB, посмотрите [myView superview], а затем [someSuperView subviews] и попробуйте манипулировать их цветами BG в отладчике, чтобы посмотреть, сможете ли вы найти, какой это. Однако, если вы внедрите исправление таким образом, имейте в виду, что оно может быть несовместимо в будущем.

Вы также можете попробовать установить цвет BG для одного из представлений за табличным представлением в Интерфейсном Разработчике (или самого окна).

0

вы можете установить фоновый вид на непрозрачный белый. Тогда используйте

self.tableView.backgroundColor = [UIColor grayColor];

в представлении сделал метод загрузки.

18

вы можете изменить это, изменив фоновое представление таблицы.

[self.tableView setBackgroundView:view];

сделайте цвет фона вида таким же, как цвет вашего родительского вида.

27

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, который имеет размеры 320х480 пикселей, он не будет занимать сколько-нибудь значительную память, потому что CALayer не имеет какого-либо значимого контента.

NOTE: Почему этот ответ актуален, когда "принято"? ответ намного проще? Почему бы просто не установитьbackgroundView на табличном представлении? Это потому, что в случае приложения "Контакты", как показано в исходном вопросе, область "выше" представление таблицы имеетdifferent Цвет фона (светло-синий), чем в области «ниже» вид таблицы (белый). Этот метод позволяет вам иметь два разных цвета выше и ниже табличного представления, что не может быть достигнуто простым фоном.

EDIT 1/2018: Как отметил Том в комментариях, этот ответ довольно старый и предполагает, что все устройства iOS имеют одинаковый размер экрана (кажется сумасшедшим, но это был случай в 2009 году, когда я ответил на это). Концепция, которую я здесь представляю, все еще работает, но вы должны использоватьUIScreen.main.bounds выяснитьactual Размер экрана, или вы могли бы получить некоторые модные вещи автоматической компоновки (предложения приветствуются). Я не рекомендую использоватьtableView.bounds как в другом ответе, потому что, как правило, вviewDidLoad размер ваших представлений не обязательно равен размеру, которым они станут после того, как контроллер изменит их размеры. Иногда они начинаются как 0x0!

Но что, если у вас есть контроль обновления для таблицы?
Это предполагает, что все устройства iOS имеют размер 320 × 480, что не было в течение достаточно долгого времени :-)
Это то, что делают большинство приложений. Тем не менее, можно прокручивать всю ценность экрана, быстро щелкая прокрутку, поэтому я предпочитаю размещать цветное представление статически позади представления таблицы и иметь прозрачный фон представления таблицы (но со сплошными фоновыми представлениями ячеек).
@TomGilder Обновил ответ.
38

жна серая область над панелью поиска, но она должна быть белой за пределами списка.

Вы можете добавить подпредставление к вашему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.

Это не работает также для нижней части таблицы, если имеется больше ячеек, чем может быть отображено одновременно. Вам нужно будет учесть высоту всех ячеек, отображаемых в таблице, и, возможно, разделители между ними.
Вы спасли мой день! Большое спасибо!!!
18

Предложение Хуссейна Б.:

Swift 3

let bgView = UIView()
bgView.backgroundColor = UIColor.white
self.tableView.backgroundView = bgView

Objective C

UIView *bgView = [UIView new];
bgView.backgroundColor = [UIColor whiteColor];
[self.tableView setBackgroundView:bgView];
7

Swift фОТ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)
Работает как шарм! Обновление для swift 3: frame.size.width = UIScreen.main.bounds.size.width Спасибо
Этот способ действительно работает только для изменения цвета фона области отскока. Что было именно то, что мне было нужно. Спасибо!
4

Cause

я использовалИнспектор искры изучить макет представления таблицы - что действительно помогло.

Дело в том, что в этом сценарии UITableView имеет 3 подпредставления:

UITableViewWrapperView UIView - With backgroundColor set to light gray color UISearchBar

При перелистывании содержимого табличного представления вниз, высота второго подпредставления динамически увеличивается, чтобы заполнить пространство междуUITableViewWrapperView иUITableView происхождение кадра.

Solution

Настройка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];
}
4

dColor UITableView, чтобы он был прозрачным, установите backgroundColor ячейки contentView на любой цвет, каким вы хотите, чтобы были фактические ячейки, а затем важно, чтобы светло-серый цвет появился позади 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];

Затем внутри части tableView: cellForRowAtIndexPath: которая создает новые ячейки, добавьте: -

// set an opaque background for the cells 
cell.contentView.backgroundColor = [UIColor whiteColor];
Семь лет спустя мне нравится это решение! Возврат от меня. Спасибо @ U62 :-) - Эрик
Использование прозрачного фона - самое последнее средство. Это сильно повлияет на производительность прокрутки. Простое добавление серого подпредставления в UIListView дает желаемый эффект, является более настраиваемым и не влияет на производительность.
Как я уже сказал, я попробовал все очевидные способы достижения этого эффекта, как и все, что предлагают другие ответы, и ни один из них не сработал. Я единственный, кто предоставил рабочее решение, и нет, он вообще не влияет на производительность прокрутки - я пробовал его на симуляторе и устройстве. Но благодаря вашему отрицательному ответу мое решение имеет спасительные голоса как все неправильные ответы.
7

Swift (протестировано на iOS9)

    let backView = UIView(frame: self.tableView.bounds)
    backView.backgroundColor = UIColor.clearColor() // or whatever color
    self.tableView.backgroundView = backView
Мне не нужно было устанавливать рамку представлений в init, что мне подходит, потому что размер таблицы вычисляется позже :)
0

изложенному Пейлоу, для UITableView, просто добавив подпредставление. Мое единственное изменение в коде состояло в том, чтобы получить цвет, немного ближе к тому, который используется в приложениях Apple, плюс я немного ближе к тому, как Apple выглядела как линия над UISearchbar, уменьшив координату y начала кадра на единицу. пиксели:

frame.origin.y = -frame.size.height - 1
0

Вы затронули строки, потому что строки имеют backgroundColor == clear (или полупрозрачный). Таким образом, если вы сделаете строки непрозрачными, все будет работать нормально. Это будет решением.

Похожие вопросы