调整UITableViewCell框架问题的大小

时间:2011-05-13 19:25:57

标签: ios objective-c iphone uitableview

我正在尝试通过以下方式调整UITableViewCell's框架的大小:

 [cell setFrame:CGRectMake(cell.frame.origin.x, 
                           cell.frame.origin.y, 
                           cell.frame.size.width, 
                           cell.frame.size.height+25)];

然而,在我这样做之后它没有调整大小......为什么会这样?

这很奇怪,好像我在单元格中添加UIToolBar,它会调整大小但是当我添加UIView时,它不会:

[cell.contentView addSubview:sideSwipeView];

2 个答案:

答案 0 :(得分:8)

这是它的长短:

  1. 您的单元格宽度取决于它所在的tableview的宽度。
  2. [编辑:如果是分组表视图,单元格比桌面宽度窄20-60像素,具体取决于您使用的是iPhone还是iPad。]

    1. 您的手机高度由heightForRowAtIndexPath方法确定。
    2. 如果您手动设置单元格的框架,那么除非您使用要根据单元格尺寸添加子视图的子类化单元格,否则它将无用。

      即使在这种情况下,建议使用rectForRowAtIndexPath:(NSIndexPath*)indexPath方法从tableview获取单元格的帧,然后将该帧设置为单元格的帧(将帧的原点Y设置为0后)。

      我不太确定UIToolBar,但是你的子视图的框架在更改单元格框架时不会改变。

      也许如果你能告诉我们你想要达到的目标,我们可以为你推荐一个解决方案吗?


      -------------------- EDIT --------------------


      因此,您需要在点击它时动态地将子视图添加到单元格,并根据新的子视图调整其高度。这会变得毛茸茸所以这就是:

      在.h文件中声明:

      BOOL subviewAdded;
      

      在你的.m文件中,在init中执行:

      subviewAdded = NO;
      

      假设您希望单元格的高度在没有子视图的情况下为50,而在子视图中则为100。因此,你的heightForRow方法应该是:

      - (CGFloat)tableView:(UITableView *)tableView 
                 heightForRowAtIndexPath:(NSIndexPath *)indexPath {
          return (subviewAdded?100.0f:50.0f);
      }
      

      这意味着,由于subviewAdded为NO,因此所有单元格的高度都会更小。

      现在,要在点击它时向单元格添加子视图,并动态更改它的高度,请在didSelectRow方法中执行此操作:

      - (void)tableView:(UITableView *)tableView 
              didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
          //Get the cell at this indexPath
      
          UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath];
      
          if(subviewAdded)
          {
              subviewAdded = NO;
      
              for(int i = 0; i < [thisCell.contentView.subviews count]; i++)
              {
                  UIView *thisSubview = [thisCell.contentView.subviews objectAtIndex:i];
                  [thisSubview removeFromSuperview];
              }
          }
          else 
          {
              UIView *someView = [[UIView alloc] initWithFrame:someFrame];
      
              [thisCell.contentView addSubview:someView];
              [someView release];
      
              subviewAdded = YES;
          }
      
          NSMutableArray *array = [NSMutableArray array]; 
      
          [array addObject:indexPath];
      
          [tableView reloadRowsAtIndexPaths:array 
                           withRowAnimation:UITableViewRowAnimationFade];
      }
      

      所以这里会发生的是你要为你挖掘的这个细胞添加一个子视图。重新加载此单元格将调用heightForRowAtIndexPath并执行一个漂亮的小淡入淡出动画并更改您的tableview高度。

      重要提示:理想情况下,您应该使用布尔值维护一个NSNumbers数组。数组大小应与您拥有的tableview单元格的大小相同。

      在heightForRow中,您将检查此数组,而不是对整个tableView使用单个布尔值。这将确保您可以为不同的单元格提供不同的高度。

      这看起来像是:

      - (CGFloat)tableView:(UITableView *)tableView 
                 heightForRowAtIndexPath:(NSIndexPath *)indexPath {
          BOOL thisBool = (BOOL)[[booleanArray objectAtIndex:indexPath.row] boolValue];
      
          return (thisBool?100.0f:50.0f);
      }
      

      我没有在这里发布所有代码,因为它是隐含的,我发布的内容应该会让你顺利完成布尔数组的工作。

      无论如何,你有。我自己测试了这段代码,所以它有效:)

答案 1 :(得分:5)

如果您想根据某些参数增加单元格的高度,例如。文字,图像, 您必须在代码中实施heightForRowAtIndexPath UITableViewDelegate方法。

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath