Выбранный пользователем цвет фона для сгруппированного UITableViewCell - PullRequest
5 голосов
/ 06 апреля 2011

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

Я бы использовал свойства UITableViewCell backgroundView и selectedBackgroundView, но они нарушают сгруппированныескругленные углы стиля табличного представления.

Сейчас у меня есть подкласс UITableViewCell, который переопределяет -setHighlighted:animated: и -setSelected:animated: для переключения backgroundColor ячейки.Это работает отлично, за исключением того, что оно не анимируется, даже если backgroundColor является анимируемым свойством, и изменения в нем заключаются в вызовы к -beginAnimations:context: и -commitAnimations, когда это необходимо.

Ответы [ 2 ]

0 голосов
/ 30 мая 2011

Я разработал следующее решение:

Подкласс UITableViewCell. Определите цвета фона для выбранной и не выделенной ячейки, например ::1003 *

#define SELECTED_BACKGROUND_COLOR [UIColor redColor]
#define NOT_SELECTED_BACKGROUND_COLOR [UIColor whiteColor]

(Вы также можете создавать специально разработанные свойства)

Затем вы должны переопределить два метода UITableViewCell. Я также ввел простую анимацию, поскольку, как указано @lemnar, свойство backgroundColor не является анимируемым. Анимация может быть намного лучше с использованием NSTimers, но это сделает код еще длиннее.

- (void) mixBackgroundColorWithSelectedColorMultiplier:(NSNumber *)multiplier 
{
    CGFloat *selComponents = (CGFloat *) CGColorGetComponents(SELECTED_BACKGROUND_COLOR.CGColor);
    CGFloat *notSelComponents = (CGFloat *) CGColorGetComponents(NOT_SELECTED_BACKGROUND_COLOR.CGColor);

    if((CGColorGetNumberOfComponents(SELECTED_BACKGROUND_COLOR.CGColor) == 2)
    {
        selComponents[2] = selComponents[1] = selComponents[0];
    }

    if((CGColorGetNumberOfComponents(NOT_SELECTED_BACKGROUND_COLOR.CGColor) == 2)
    {
        notSelComponents[2] = notSelComponents[1] = notSelComponents[0];
    }

    CGFloat m = [multiplier floatValue];
    self.backgroundColor = [UIColor colorWithRed:(notSelComponents[0]) * (1.0 - m) + (selComponents[0]) * m
                                                                                 green:(notSelComponents[1]) * (1.0 - m) + (selComponents[1]) * m
                                                                                    blue:(notSelComponents[2]) * (1.0 - m) + (selComponents[2]) * m
                                                                                 alpha:1.0];
    [self setNeedsDisplay];
}

- (void) setSelected:(BOOL)selected animated:(BOOL)animated 
{
    if(selected) 
    {
        if(animated)
        {
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:1.0] afterDelay:0.40];
        }
        else
        {
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:1.0]];
        }
    }
    else
    {
        if(animated)
        {
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.0] afterDelay:0.40];
        }
        else
        {
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:0.0]];
        }
    }
    [super setSelected:selected animated:animated];
}

- (void) setHighlighted:(BOOL)highlighted animated:(BOOL)animated 
{
    if(highlighted) 
    {
        if(animated)
        {
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:1.0] afterDelay:0.40];
        }
        else
        {
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:1.0]];
        }
    }
    else
    {
        if(animated)
        {
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.8] afterDelay:0.08];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.6] afterDelay:0.16];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.4] afterDelay:0.24];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.2] afterDelay:0.32];
            [self performSelector:@selector(mixBackgroundColorWithSelectedColorMultiplier:) withObject:[NSNumber numberWithFloat:0.0] afterDelay:0.40];
        }
        else
        {
            [self mixBackgroundColorWithSelectedColorMultiplier:[NSNumber numberWithFloat:0.0]];
        }
    }
    [super setHighlighted:highlighted animated:animated];
}
0 голосов
/ 06 апреля 2011

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

Единственное известное мне решение для изменения стиля выбора ячеек сгруппированных табличных представлений - это использование 4 фонов (верхний, нижний, средний, верхний и нижний) и их применениепо положению ячейки в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...