Подтвердить что ты не робот

Светло-серый фон в области "отскока" UITableView

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

Screenshot of Contacts app showing light gray background

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

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

4b9b3361

Ответ 1

Начиная с iOS 7, вы можете изменить это, изменив представление в виде таблицы.

[self.tableView setBackgroundView:view];

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

Ответ 2

Настройка прозрачности плохо для производительности. То, что вы хотите, - это серая область над панелью поиска, но она должна оставаться белой за пределами списка.

Вы можете добавить 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.

Ответ 3

Это один из моих самых любимых трюков.

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 нет никакого содержательного контента.

Ответ 4

Чтобы увеличить на предложение 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];

Ответ 5

В Swift (проверен на iOS9)

    let backView = UIView(frame: self.tableView.bounds)
    backView.backgroundColor = UIColor.clearColor() // or whatever color
    self.tableView.backgroundView = backView

Ответ 6

Этот код работает в 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)

Ответ 7

Я нашел только один способ сделать это. Вы должны установить, что 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];

Ответ 8

Я сам столкнулся с этой проблемой и нашел решение.

Причина

Я использовал 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];
}

Ответ 9

Я дам вам лучший способ сделать это.
Сначала установите цвет фона в виде таблицы так, как вы хотите, в построителе интерфейса.
Затем ответьте на метод делегата 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];

Ответ 10

EASIEST SOLUTION

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

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

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

Ответ 11

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

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

Ответ 12

Если вы используете tableviewcell, вы можете установить, что фон представления непрозрачен белым цветом. Затем используйте

self.tableView.backgroundColor = [UIColor grayColor];

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

Ответ 13

Я уверен, что это [UITableView backgroundColor]. Вы затронули строки, потому что строки имеют backgroundColor == clear (или полупрозрачные). Итак, если вы сделаете строки непрозрачными, все будет работать нормально. Это будет решение.

Ответ 14

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

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

Ответ 15

Для тех, кто задается вопросом, как сделать то же самое для нижней области отказов:

Сначала добавьте 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;
}