Проблема с CAGradientLayer в пользовательском UIView в UITableViewCell - PullRequest
0 голосов
/ 18 сентября 2010

У меня есть особая ситуация, с которой мне нужна помощь.У меня есть CustomView, который я помещаю в каждый UITableViewCell в моем UITableView.Никаких проблем там нет.

В моем CustomView есть UILabel, которая отображает некоторый текст, переданный ему.В зависимости от длины текста ширина CustomView увеличивается / уменьшается.Все в порядке.

Проблема, с которой я столкнулся, связана с подуровнем в моем CustomView, который является градиентом (CAGradientLayer).Размер градиента не будет увеличиваться / уменьшаться на экране не видимых ячеек.

Позвольте мне показать вам некоторый код ... Я создаю свой CustomView примерно так:

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];

    CustomView *custom = [[CustomView alloc] init];
    custom.tag = 777;
    [cell.contentView addSubview:custom];
    [custom release];

}

}

На этом этапе я не запускаю initWithFrame, поскольку ячейка может быть повторно использована, а ширина всегданеправильно.Как только ячейка окажется там, я вызываю метод configureCell: где я делаю следующее:

CGSize teamMaxSize = CGSizeMake(300, 18);
CGSize teamNewSize = [[managedObject valueForKey:@"category"] 
    sizeWithFont:[UIFont systemFontOfSize:kFontSizeTeam]
    constrainedToSize:teamMaxSize
    lineBreakMode:UILineBreakModeWordWrap];

CustomView *lozenge = (CustomView *) [cell.contentView viewWithTag:777];
lozenge.frame = CGRectMake(10, 5, teamNewSize.width+12, 18);
[lozenge resetSize];
[lozenge setLabel:[managedObject valueForKey:@"category"]];

Это прекрасно работает, ширина моего CustomView настраивается в соответствии с длиной ключа «category».ResetSize;описанный выше метод просто изменяет размер UILabel, который я упоминал ранее, до нового фрейма CustomView, прежде чем заполнить его значением.

В любом случае, вернемся к моей проблеме.Я создаю фоновый градиент в drawRect: метод моего CustomView.Работает нормально, однако размер CustomView у init.После того, как я изменил размер, мне нужно изменить размер градиента.Итак, я попытался добавить

gradient.frame = self.bounds

, когда я вызываю resetSize в моем вышеупомянутом коде.Однако при прокрутке UITableView я вижу градиент, буквально заполняющий слева направо, когда он загружается в поле зрения.Могу ли я в любом случае сделать так, чтобы это происходило «за кадром», поэтому CustomView заполняется градиентом, как только он появляется?

1 Ответ

1 голос
/ 18 сентября 2010

Вместо создания градиента в drawRect:, вы рассматривали возможность использования CAGradientLayer в качестве класса слоя для своего пользовательского вида, например:

+ (Class)layerClass
{
    return [CAGradientLayer class];
}

Затем вы можете выполнить любую настройку вашего градиента вваш инициализатор, через self.layer.

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