Добавление ряда значков в ячейку таблицы - PullRequest
0 голосов
/ 21 февраля 2010

Хорошо, я просто слишком близок к этому, я думаю. У меня есть столик. В этом табличном представлении все работает, за исключением строки 2 раздела 0.

И - прежде чем кто-нибудь спросит ... Я знаю, что я не использую * imgWordView (в приведенном ниже коде), и поэтому значки не отображаются, но я не знаю, где добавить его в подпредставление, поэтому я может разместить его в координатах в ячейке ...:)

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
  if (indexPath.section == 2 && indexPath.row == 0)
  {
   cell = [self getCellContentViewForIconRow:CellIdentifier];
   cell.backgroundColor = [UIColor grayColor];

  }
  else
        {
   cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
  }
 }
}

Приведенный выше код (кроме моего добавления of my section == 2 && indexPath.row == 0) является обычным и общим.

getCellContentViewForIconRow определяется здесь:

    - (UITableViewCell *) getCellContentViewForIconRow:(NSString *)cellIdentifier {

 ResortsListViewController *resortsListViewController = [[ResortsListViewController alloc] init];
 NSMutableArray *categoryArray = [resortsListViewController getCategoriesForLocation:[[locationData objectForKey:@"theid"]intValue]];
 [resortsListViewController release];

 CGRect CellFrame = CGRectMake(0, 0, 260, 60);
 UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier] autorelease];
 cell.contentView.backgroundColor = [UIColor grayColor];
 int x = 10;
 int y = 10;

 for (NSMutableDictionary *cat_object in categoryArray) {

  CGRect Label1Frame = CGRectMake(x, y, x + 40, 40);
  UILabel *lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
  lblTemp.tag = x + 1;

  NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"alcohol.png"];
  UIImage *imgWord = [[[UIImage alloc] initWithContentsOfFile:filePath] autorelease];

  UIImageView *imgWordView = [[[UIImageView alloc] initWithImage:imgWord] autorelease];

  [cell.contentView addSubview:lblTemp];
  [lblTemp release];

  x = x + 30;
 }

 return cell;
        }

Хорошо, так что

ResortsListViewController *resortsListViewController = [[ResortsListViewController alloc] init];
NSMutableArray *categoryArray = [resortsListViewController getCategoriesForLocation:[[locationData objectForKey:@"theid"]intValue]];
[resortsListViewController release];

возвращает группу категорий, которые я использовал бы для создания имен файлов для изображений PNG. Пока все в порядке. Затем я перебираю массив, чтобы построить места для изображений в ячейке.

Я ожидаю не более 5 изображений ... 30x30 каждое. Итак, чтобы проверить, я просто использовал существующее имя файла "cohol.png ". Я хочу, чтобы все 5 изображений отображались в строке внутри ячейки

Я уже делаю это:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 if (indexPath.section == 2 && indexPath.row == 0)
        {
        return 60;
 }
}

Но все, что я вижу, - это клетка моего стола (серого цвета, как и должно быть) с длинной белой коробкой внутри.

Итак, два вопроса.

1: коробка (я предполагаю, что это CGRect CellFrame = CGRectMake(0, 0, 260, 60);) белого цвета. Мне нужно знать, как изменить это на серый ... точно так же, как фон моей клетки.

Основная причина в том, что мои значки белые ... и я не могу сказать, видны ли значки или нет.

Если единственная проблема в том, что этот белый CGRECT скрывает мои значки, то все хорошо.

В противном случае мы подходим к # 2:

2: Это лучший способ поместить группу значков в строку ячейки, когда имена значков находятся внутри массива?

Если нет, то как?

Итак, как мне сделать CGRect серым и как сделать так, чтобы 5 ячеек отображались в ячейке горизонтально?

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 21 февраля 2010

Большое длинное белое поле - это ваши ярлыки, которые вы создаете и добавляете в contentView. UILabels непрозрачные с белым фоном. Сделайте следующее:

lblTemp.backgroundColor = [UIColor clearColor];

Это избавит вас от белого поля, чтобы вы могли видеть, что скрывается за вашими ярлыками.

Другая проблема заключается в том, что вы добавляете свои х + 40 на каждой итерации цикла. Я бы подумал, что вы захотите, чтобы ширина была постоянным значением, и не добавляя ваши координаты X + 40 каждый раз, в результате вы получите довольно широкий набор меток в вашей ячейке.

0 голосов
/ 21 февраля 2010

Ладно, узнал, как сделать это элегантно и с изяществом. Я голосую за ответ @ bstahlhood в качестве ответа, поскольку это частично то, что мне нужно было знать ... однако эта подпрограмма вместо той, которую я представил выше, - это то, как я полностью исправил ее.

- (UITableViewCell *) getCellContentViewForIconRow:(NSString *)cellIdentifier {

    ResortsListViewController *resortsListViewController = [[ResortsListViewController alloc] init];
    NSMutableArray *categoryArray = [resortsListViewController getCategoriesForLocation:[[locationData objectForKey:@"theid"]intValue]];
    [resortsListViewController release];

    MainAppDelegate *mainAppDelegate = [[MainAppDelegate alloc] init];

    CGRect CellFrame = CGRectMake(10, 10, 100, 40);
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame reuseIdentifier:cellIdentifier] autorelease];

    int x = 10;
    int y = 10;
    int ctr = 0;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    for (NSString *category_name in categoryArray) {
        if (ctr <= 7)
        {
            BOOL valid_for_user = [mainAppDelegate validate_category_for_users_level:category_name];
            if (valid_for_user)
            {
                NSMutableString *subt = [[[NSMutableString alloc]init]autorelease];
                [subt appendString: category_name];
                [subt appendString: @".png"];

                NSString *filePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:[NSString stringWithString:subt]];
                BOOL success = [fileManager fileExistsAtPath:filePath];
                if (success)
                {
                    UIImage *imgWord = [[[UIImage alloc] initWithContentsOfFile:filePath] autorelease];
                    UIImageView *imgWordView = [[[UIImageView alloc] initWithImage:imgWord] autorelease];

                    CGRect Label1Frame = CGRectMake(x, y, 30, 30);
                    UILabel *lblTemp = [[UILabel alloc] initWithFrame:Label1Frame];
                    lblTemp.tag = x + 1;
                    // BEGIN FIX TO MY PROBLEM: thanks @bstahlhood
                    lblTemp.backgroundColor = [UIColor clearColor];
                    // END FIX TO MY PROBLEM
                    [lblTemp addSubview:imgWordView];

                    [cell.contentView addSubview:lblTemp];
                    [lblTemp release];

                    x = x + 40;
                    ctr += 1;
                }
            }
        }


    }
    [mainAppDelegate release];
    return cell;
}

Как вы видите, я также изменил CGRECT внутри своей петли, чтобы исправить горизонтальный интервал:

CGRect Label1Frame = CGRectMake(x, y, 30, 30);

как подсказал @bstahlhood. Я забыл, что команды CGRrect обрабатывают начальные точки и ширину вместо начальных и конечных точек внутри области ячейки. вот почему я подумал, что должен использовать х + 40. Как уже говорилось, теперь это исправлено.

Я также изменил это heightForRowAtIndexPath, чтобы лучше сбалансировать внешний вид изображения 30x30 пикселей. Надпись выше запускает мое подпредставление в 10 пикселей по ширине и 10 пикселей вниз изнутри ячейки, поэтому имеет смысл убедиться, что ячейка имеет 50 пикселей по вертикали, а не 60 пикселей, поэтому в верхней части есть ровно 10 пикселей и 10 пикселей нижняя часть значка.

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 if (indexPath.section == 2 && indexPath.row == 0)
        {
        return 50;
 }
}

Итак, хотя я решил свою собственную проблему до публикации @bstahlhood, я даю ему право голоса за правильный ответ, поскольку он был правильным. Я также хотел бы отметить, что хотел бы, чтобы больше людей разместили фиксированный код после того, как их проблема была исправлена, чтобы другие, имеющие такую ​​же проблему, знали, что (точно) они сделали. Вот почему я разместил этот код.

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