向表格单元格添加一行图标

时间:2010-02-20 21:17:07

标签: iphone objective-c image uitableview

好吧,我认为我离这个太近了。我有一个tableview。在该表视图中,除了第2行第0行外,一切正常。

AND - 在有人询问之前...我知道我没有使用* 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。所以,为了测试,我只使用了存在的文件名“alcohol.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 个答案:

答案 0 :(得分:1)

大长白框是您正在制作的标签并添加到contentView。 UILabels是不透明的,带有白色背景。执行以下操作:

lblTemp.backgroundColor = [UIColor clearColor];

这将摆脱白框,以便您可以看到标签背后的内容。

另一个问题是你在循环的每次迭代中添加x + 40。我认为你会希望宽度是一个恒定的值,而不是每次都加上你的X坐标+40,这最终会在你的单元格中制作一组相当广泛的标签。

答案 1 :(得分:0)

好的,找到了如何优雅地做到这一点并具有天赋。我投票给@ 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命令处理起始点和宽度而不是单元格区域内的起点和终点。这就是为什么我认为我必须使用x + 40。如上所述,现在已经更正了。

我还更改了heightForRowAtIndexPath以更好地平衡30x30像素图像的外观。上面的标签从单元格内部开始我的子视图10px和10px,因此确保单元格垂直为50px而不是60px是有意义的,因此顶部 10px正好有10px在图标的底部。

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

所以,即使我在@bstahlhood发布之前解决了我自己的问题,我也会给他投票给出正确答案,因为它是正确的。我还想指出,我希望更多的人在问题得到纠正后发布固定代码,以便其他有相同问题的人知道他们做了什么(确切地说)。这就是我发布此代码的原因。