2010-05-25 2 views
0

Я использую следующий код, чтобы собрать UITableView. Высота ячейки позволяет показывать первые три строки в таблице без прокрутки. Все в порядке с этими первыми тремя рядами. Но как только я прокручиваю вниз по сравнению с первоначальными первыми тремя строками, изображение в myImage наследует ширину ячеек в первых трех строках и не изменяет размер в соответствии со значением, извлеченным из массива на основе indexPath.row.Динамическое изменение ширины UIImage в ячейке UITableView в Xcode

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

Любая помощь очень ценится! LQ

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

const NSInteger LABEL_TAG = 1001; 
const NSInteger IMAGE_TAG = 1002; 

UILabel *myLabel; 
UIImageView *myImage; 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell *cell = [myTableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 

    // Create the cell 

    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
         reuseIdentifier:CellIdentifier] 
         autorelease]; 

    // Constant values 

    const CGFloat LABEL_HEIGHT = 20; 
    const CGFloat LABEL_WIDTH = 140; 
    const CGFloat LABEL_INDENT = 1; 
    const CGFloat LABEL_TOP = 0.065 * myTableView.rowHeight; 

    // Create the label; 

    myLabel = [[[UILabel alloc] initWithFrame: 
      CGRectMake(
       LABEL_INDENT, 
       LABEL_TOP + LABEL_HEIGHT, 
       LABEL_WIDTH, 
       LABEL_HEIGHT)] 
      autorelease]; 

    [cell.contentView addSubview:myLabel]; 

    // Configure the label 

    myLabel.tag = LABEL_TAG; 
    myLabel.backgroundColor = [UIColor clearColor]; 
    myLabel.textColor = [UIColor blueColor]; 
    myLabel.font = [UIFont systemFontOfSize:[UIFont labelFontSize] - 3]; 
    myLabel.textAlignment = UITextAlignmentRight; 

    // Create the image (NOTE: THIS IS THE PROBLEMATIC PART) 

    // Extract the width for the image based on an array value for each row: 

    int xValue = [[myArray objectAtIndex:(indexPath.row)]intValue]; 
    float xLength = (float)xValue/100; 

    myImage = [[[UIImageView alloc] initWithFrame: 
       CGRectMake(
        LABEL_INDENT + 53,    // This places the image to the right of the label 
        LABEL_TOP + LABEL_HEIGHT, 
        xLength * LABEL_WIDTH,   

// Это где ширина каждой строки регулируется LABEL_HEIGHT] autorelease];

[cell.contentView addSubview:myImage]; 

    myImage.contentMode = UIViewContentModeLeft; 
    myImage.image = [UIImage imageNamed:@"ProgressBar.png"]; 
    myImage.clipsToBounds = YES; 

} else { 

    // Re-use cells 

    myLabel = (UILabel *)[cell viewWithTag:LABEL_TAG]; 
    myImage = (UIImageView *)[cell viewWithTag:IMAGE_TAG]; 
} 

return cell; 

} 

ответ

1

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

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

Итак, попробуйте приближается к нему, как это вместо:

- (void) configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

    UILabel *settingText = [ISInterfaceElement getLabel:Headline]; //Opps... ISInterfaceElement is my custom class. All it does is return a UILabel with settings that comply for a Headline label, according to an enum in the header. 
    [settingText setFrame:CGRectMake(0.0f, 15.0f, 320.0f, 20.0f)]; 
    [settingText setTextAlignment:UITextAlignmentCenter]; 
    [settingText setTag:SETTINGS_LABEL]; 
[cell addSubview:settingText]; 
    UIView *background = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 50.0f)]; 
    [cell addSubView:background]; //added 
    [background release]; //added 

[cell setSelectionStyle:UITableViewCellSelectionStyleNone];  
} 

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) {  
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
     [self configureCell:cell atIndexPath:indexPath]; 
    } 


    [(UILabel*)[cell viewWithTag:SETTINGS_LABEL] setText:@"Settings…"]; 

    return cell; 
} 

Так cellForRowAtIndexPath вызвать метод configureCell, если он нуждается в новой установки ячейки, иначе он просто обновляет ячейку с правильным значением из модели (обычно [someArray objectAtIndex: indexPath.row], но в моем случае просто строка.

Итак, отправляйте по любому параметру (высоте), который вам нужен, чтобы настроить метод configureCell, чтобы он мог построить вашу ячейку, и сделать все здание в этот метод и все обновления в cellForRowAtIndex.

Надеюсь, что это имеет смысл :)

+0

Благодарим вас за ваш быстрый ответ и заставим меня преодолеть этот барьер. Я только что перестроил его после вашего примера, и он отлично работает. Вот дополнительный элемент для тех, кто еще ищет решение этого типа элемента дизайна: ... // Deal Метки Текста в ячейке: [(UILabel *) [клетка viewWithTag: SETTINGS_LABEL] SetText: @» Настройки ... "]; // Сделка с переменной шириной изображения в Cell: [(UIImageView *) [клетка viewWithTag: IMAGE_TAG] setFrame: CGRectMake ( (0.0f, 15.0f, xLength * LABEL_WIDTH, 20.0f)];. –

+0

Вы можете Рассматривайте помечая вопрос как ответ;) – RickiG

+0

Когда вы 'alloc'' переменную' background', вы пропускаете память. –

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