подробно останавливаясь "dict как переключатель" идея. если Вы хотите использовать значение по умолчанию для своего переключателя:
def f(x):
try:
return {
'a': 1,
'b': 2,
}[x]
except KeyError:
return 'default'
Я не думаю, что вы хотите переопределить drawRect. Скорее всего, вы видите цвет фона другого представления или окна, которое находится «позади» (то есть является надзором) табличного представления. Обычно в виджетах пользовательского интерфейса Apple есть довольно сложные уровни UIViews. Изучите иерархию представлений в GDB, посмотрите [myView superview], а затем [someSuperView subviews] и попробуйте изменить их цвета BG в отладчике, чтобы узнать, сможете ли вы найти, какой это. Однако, если вы реализуете исправление таким образом, имейте в виду, что оно может быть несовместимым в будущем.
Вы также можете попробовать установить цвет BG одного из представлений за табличным представлением в Interface Builder (или самого окна).
Если вы используете tableviewcell, вы можете установить непрозрачный белый фон представления. Затем используйте
self.tableView.backgroundColor = [UIColor grayColor];
в представлении метода загрузки.
Я уверен, что это [UITableView backgroundColor]. Вы затронули строки, потому что строки имеют backgroundColor == clear (или полупрозрачные). Итак, если вы сделаете строки непрозрачными, все будет работать нормально. Это будет решением.
Я нашел только один способ сделать это. Вы должны установить backgroundColor UITableView, чтобы он был прозрачным, установите backgroundColor ячейки contentView на любой цвет, который вы хотите, чтобы фактические ячейки были, а затем, что очень важно, вы должны получить светло-серый цвет, чтобы он отображался за UITableView. Последний шаг вы можете сделать, установив backgroundColour UIWindow или того, что он содержит, или вашего tableViewController.
Итак, если у вас есть контроллер представления, производный от UITableViewController, вставьте эти строки в - (void) viewDidLoad method: -
// 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];
Установка прозрачности плохо сказывается на производительности. Вам нужна серая область над панелью поиска, но она по-прежнему должна быть белой за пределами конца списка.
Вы можете добавить подпредставление в свой UITableView
, которое вместо этого находится над содержимым.
12103] При желании вы можете добавить к представлению более причудливые элементы, например, переход или разделительную линию без подкласса 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 не имеет значимого содержимого.
ПРИМЕЧАНИЕ: Почему этот ответ уместен, когда «принятый» ответ намного проще? Почему бы просто не установить backgroundView
в виде таблицы? Это потому, что в случае приложения «Контакты», как показано в исходном вопросе, область «над» табличным представлением имеет другой цвет фона (голубой), чем область «под» табличным представлением ( белый). Этот метод позволяет вам иметь два разных цвета над и под табличным представлением, что не может быть выполнено с помощью простого фона.
РЕДАКТИРОВАТЬ 1/2018: Как отметил Том в комментариях, этот ответ довольно старый и предполагает, что все устройства iOS имеют одинаковый размер экрана (кажется безумным, но так было в 2009 году, когда я ответил на это). Концепция, которую я представляю здесь, по-прежнему работает, но вы должны использовать UIScreen.main.bounds
, чтобы определить фактический размер экрана, или вы можете заняться некоторыми причудливыми элементами автоматической компоновки (приветствуются предложения ). Я не рекомендую использовать tableView.bounds
, как в другом ответе, потому что обычно в viewDidLoad
размер ваших представлений не обязательно равен размеру, которым они станут после того, как контроллер изменит их размер. Иногда они начинаются как 0x0!
Я последовал за наконечником, изложенным Puylow, для UileabeView, просто добавляя подсчет. Мои единственные изменения из кода было немного ближе к тому, что используемый в Apple Apps, плюс я получил немного ближе к внешности Apple наличие линейки над UISearchBar, уменьшив координатую рамы. Координата на одном пикселе:
frame.origin.y = -frame.size.height - 1