Вопрос

Я хотел бы настроить фон (и, возможно, границу) всех UITableViewCells в моем UITableView.До сих пор мне не удалось настроить этот материал, поэтому у меня есть несколько ячеек с белым фоном, которые используются по умолчанию.

Есть ли способ сделать это с помощью iPhone SDK?

Это было полезно?

Решение

Вам нужно установить backgroundColor для contentView ячейки в свой цвет. Если вы используете аксессуары (например, стрелки раскрытия и т. Д.), Они будут выделены белым цветом, поэтому вам может потребоваться свернуть их версии.

Другие советы

Вот наиболее эффективный способ решения этой проблемы, с которым я столкнулся, - использовать метод делегата willDisplayCell (он заботится о белом цвете для фона текстовой метки, а также при использовании cell.textLabel.text и / или ячейки. detailTextLabel.text):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Когда вызывается этот метод делегата, цвет ячейки контролируется через ячейку, а не через табличное представление, как при использовании:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

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

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

Это решение хорошо сработало в моих обстоятельствах ...

Это действительно просто, поскольку OS 3.0 просто устанавливает цвет фона ячейки в методе willDisplayCell.Не следует задавать цвет в ячейке cellForRowAtIndexPath.

Это работает как для простого, так и для сгруппированного стиля:

Код:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

P.S:Вот выдержка из документации для willDisplayCell:

«Вид таблицы отправляет это сообщение своему делегату непосредственно перед тем, как он использует ячейку для рисования строки, что позволяет делегату настраивать объект ячейки до его отображения.Этот метод дает делегату возможность переопределить свойства на основе состояний, установленные ранее с помощью представления таблицы, таких как выбор и цвет фона.После возвращения делегата видение таблицы устанавливает только свойства альфа и кадров, а затем только при анимировании рядов, когда они скользят или выходят ».

Я нашел эту информацию в это сообщение от полковника.Поблагодарить его!

Наилучший подход, который я нашел, - это установить фоновый вид ячейки и очистить фон для подпредставлений ячейки. Конечно, это хорошо смотрится на столах только с индексированным стилем, независимо от того, с аксессуарами или без.

Вот пример, где фон ячейки выделен желтым цветом:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}

Просто поместите это в свой файл класса делегата UITableView (.m):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}

Я согласен с Себой,    Я пытался установить цвет чередующихся строк в методе делегата rowForIndexPath, но получал противоречивые результаты между 3.2 и 4.2. Следующее отлично сработало для меня.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}

После опробования всех различных решений, следующий метод является наиболее элегантным. Измените цвет в следующем методе делегата:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}

У vlado.grigorov есть несколько полезных советов - лучший способ - создать backgroundView и присвоить ему цвет, установив все остальное в clearColor. Кроме того, я думаю, что это единственный способ правильно очистить цвет (попробуйте его образец - но установите «clearColor» вместо «yellowColor»), что я и пытался сделать.

Настройка фона ячейки табличного представления со временем становится и "все или ничего" подход. Очень сложно изменить цвет или изображение, используемое для фона ячейки содержимого, так, чтобы это не выглядело странно.

Причина в том, что ячейка фактически охватывает ширину представления. Закругленные углы являются лишь частью стиля рисования, и в этой области находится вид контента.

Если вы измените цвет ячейки с содержимым, у вас будут белые биты, видимые по углам. Если вы измените цвет всей ячейки, у вас будет блок цвета, охватывающий ширину вида.

Вы можете определенно настроить ячейку, но это не так просто, как вы думаете на первый взгляд.

Создайте представление и установите его в качестве фонового представления ячейки

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

Чтобы расширить ответ Н. Берендта. Если вы хотите установить цвет ячейки на основе некоторого состояния в фактическом объекте данных ячейки, в то время, когда вы настраиваете остальную информацию для ячейки таблицы, что обычно происходит, когда вы находитесь в cellForRowAtIndexPath, вы можете сделать это, переопределив метод willDisplayCell, чтобы установить цвет фона ячейки из цвета фона представления контента - это решает проблему фона кнопки раскрытия и т. д.это не так, но все же позволяет вам управлять цветом в методе cellForRowAtIndexPath, где вы выполняете все остальные настройки ячеек.

Так:Если вы добавите этот метод к делегату табличного представления:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

Затем в вашем методе cellForRowAtIndexPath вы можете сделать:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

Это избавляет от необходимости снова получать объекты данных в методе willDisplayCell, а также экономит два места, где вы выполняете адаптацию/настройку ячейки таблицы — вся настройка может осуществляться в методе cellForRowAtIndexPath.

Создайте изображение для использования в качестве фона в Photoshop или GIMP и назовите его myimage. Затем добавьте этот метод в ваш класс tableViewController:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

Это также будет работать, если вы установили UITableView на custom в инспекторе атрибутов.

Мое решение состоит в том, чтобы добавить следующий код в событие cellForRowAtIndexPath:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

Работает при любых обстоятельствах, даже с кнопками раскрытия, и вашей логике лучше воздействовать на состояние цвета ячеек в cellForRowAtIndexPath, чем в событии cellWillShow, я думаю.

Подкласс UITableViewCell и добавьте это в реализацию:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];

Это будет работать в последнем Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}

Попробуйте это:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top