2013-10-13 2 views
3

Я хотел бы динамически регулировать ширину UIImage внутри UITableViewCell, я использую раскадровку для разработки UITableViewCell, я просто добавил ярлык и изображение, свойства обновляются правильно, я даже загружаю значение ширины в метку, чтобы показать, что это правильное значение, для изображения я загружаю фоновое изображение, которое я хочу повторить, но изображение не будет обновить ширину сначала, если я прокрутки вверх и вниз, изображения показаны, как и ожидалось, вот код cellForRowAtIndexPath, я также пытался поставить код на метод willDisplayCell, тот же результатUITableViewCell с UIImage, ширина не обновляется на начальных отображаемых ячейках

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"mycustomcell"]; 
    int r = [[data objectAtIndex:indexPath.row] intValue]; 
    UIImageView *img = (UIImageView *)[cell viewWithTag:2]; 
    img.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"some_img" ofType:@"png"]]]; 
    CGRect frame = img.frame; 
    frame.size.width = r*16; 
    img.frame = frame; 

    int n = img.frame.size.width; 
    UILabel *label = (UILabel *)[cell viewWithTag:1]; 
    label.text = [NSString stringWithFormat:@"custom %d", n]; 
    [cell setNeedsDisplay]; 
    return cell; 
} 

I просто хочу должен работать изначально, поскольку он работает после прокрутки, мыслей?

+0

У вас есть автоматический макет включен в раскадровку? –

+0

вы никогда не создаете ячейку – vikingosegundo

+0

@vikingosegundo. При использовании прототипов соты вам не нужно создавать его. 'DequeueReusableCellWithIdentifier' создаст его для вас. – Rob

ответ

7

Динамическое изменение размера ячейки таблицы просмотра является хорошо известной проблемой. Хотя есть запутано обходные пути, я считаю, правильное решение зависит от того, используете ли вы autolayout или нет:

  • При использовании автоматической компоновки, убедитесь, что вид изображения вашей ячейки имеет ограничение ширины, а затем вы можете изменить ограничение-х constant:

    for (NSLayoutConstraint *constraint in img.constraints) 
    { 
        if (constraint.firstAttribute == NSLayoutAttributeWidth) 
         constraint.constant = r*16; 
    } 
    

    Честно говоря, я бы предпочел использовать пользовательские UITableViewCell подкласса и имеют IBOutlet для ширины ограничения (например, imageWidthConstraint), и это избавит вас от необходимости перечислять через ограничения, чтобы найти правильный один, и вы можете просто:

    cell.imageWidthConstraint.constant = r*16; 
    
  • Если не использовать функцию автоматической компоновки, вы должны создать подкласс UITableViewCell, использовать, что для базового класса вашего мобильного прототипа, а затем переопределить layoutSubviews и изменить размер изображения вид там. См. Changing bounds of imageView of UITableViewCell.

Независимо от того, какой подход вы принимаете, используя UITableViewCell подкласс исключает необходимость использовать viewForTag конструкцию, что делает код вид контроллера немного более интуитивным.

+2

Это действительно должен быть принятый ответ, а не оригинальный плакат, чтобы просто удалить автоматическую компоновку. – Michael

+0

Отличный ответ, работал как шарм. – swebal

+0

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

Смежные вопросы