Загадка CALayer и UITableViewCell - PullRequest
0 голосов
/ 03 апреля 2012

Я хотел поэкспериментировать с анимацией в UITableViewCells, поэтому я попробовал несколько простых вещей с CALayers. У меня почти сразу возникли проблемы, и я чувствую, что мне здесь чего-то не хватает. Вот мой код.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *MyIdentifier = @"MyIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
    }
    NSString* title = [self.array objectAtIndex:indexPath.row];
    cell.textLabel.text = title;

    CALayer* layer = [CALayer layer];
    layer.backgroundColor = [UIColor greenColor].CGColor;
    layer.bounds = CGRectMake(10, 10, 50, 50);
    [cell.contentView.layer addSublayer:layer];

    return cell;
}

Приведенный выше код добавляет зеленый квадрат, как и ожидалось.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"did select");
    CALayer* layer = [CALayer layer];
    layer.backgroundColor = [UIColor purpleColor].CGColor;
    layer.bounds = CGRectMake(50, 10, 50, 50);
    UITableViewCell* cell = [self tableView:self.tableView cellForRowAtIndexPath:indexPath];
    [cell.contentView.layer addSublayer:layer];

    CGRect bounds = layer.bounds;
    bounds.size.width = 200;
    layer.bounds = bounds;
}

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

1 Ответ

0 голосов
/ 03 апреля 2012

В этой строке есть ошибка:

UITableViewCell* cell = [self tableView:self.tableView cellForRowAtIndexPath:indexPath];

, вместо этого используйте это:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];

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

Также 1) не ожидайте «пурпурного квадрата, который затем вырастет до большего прямоугольника» при написаниипотому что вам понадобится магия CAAnimation для достижения этой цели.2) будьте осторожны со свойством .bounds, потому что система координат слоя отличается, прочитайте это: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreAnimation_guide/Articles/Layers.html

...