以编程方式自动调整包含多个子视图的 UITableViewCell

Posted

技术标签:

【中文标题】以编程方式自动调整包含多个子视图的 UITableViewCell【英文标题】:Programmatically autoresizing UITableViewCell containing several subviews 【发布时间】:2010-10-25 06:36:05 【问题描述】:

我有一个 UITableView,它试图看起来像一个网格:也就是说,我通过添加 UILabel**s 作为 **cell.contentView 子视图来模仿四列。 其中三个“列”具有固定宽度,在旋转时,我想自动调整最左侧列的大小以填充所有可用空间(屏幕宽度减去其他三列的总宽度)。

Cell初始化代码如下:

#define kCellWidth ((UIInterfaceOrientationIsLandscape(self.interfaceOrientation)) ? 1024 : 768)
#define kCellHeight 60

#define kXOffset 10
#define kYOffset 10
#define kContentHeight (kCellHeight - 2*kYOffset)

#define kTypeWidth  125
#define kNumberWidth 100
#define kDateWidth  90
#define kLabelWidth  (kCellWidth - (2*kXOffset + kTypeWidth + kNumberWidth + kDateWidth))

#define kTypeOffset  (kXOffset + kLabelWidth)
#define kNumberOffset (kTypeOffset + kTypeWidth)
#define kDateOffset  (kNumberOffset + kNumberWidth)

#define kLabelTag 1
#define kTypeTag 2
#define kNumberTag 3
#define kDateTag 4

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellIdentifier];

 if (cell == nil) 
  cell = [self cellWithFrame:CGRectMake(0, 0, kCellWidth, kCellHeight)
      identifier:kCellIdentifier];
 

 Clazz *obj = [self.source objectAtIndex:indexPath.row];
 ((UILabel *) [cell viewWithTag:kLabelTag]).text  = obj.label;
 ((UILabel *) [cell viewWithTag:kTypeTag]).text  = obj.type;
 ((UILabel *) [cell viewWithTag:kNumberTag]).text = obj.number;
 ((UILabel *) [cell viewWithTag:kDateTag]).text  = obj.date;

 return cell;


-(UITableViewCell *) cellWithFrame:(CGRect)frame identifier:(NSString *)identifier 
 UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:frame
               reuseIdentifier:kCellIdentifier] autorelease];

 [cell.contentView addSubview:[self labelForTag:kLabelTag
           withFrame:CGRectMake(kXOffset, kYOffset, kLabelWidth, kContentHeight)]];
 [cell.contentView addSubview:[self labelForTag:kTypeTag
           withFrame:CGRectMake(kTypeOffset, kYOffset, kTypeWidth, kContentHeight)]];
 [cell.contentView addSubview:[self labelForTag:kNumberTag
           withFrame:CGRectMake(kNumberOffset, kYOffset, kNumberWidth, kContentHeight)]];
 [cell.contentView addSubview:[self labelForTag:kDateTag
           withFrame:CGRectMake(kDateOffset, kYOffset, kDateWidth, kContentHeight)]];

 return cell;


-(UILabel *)labelForTag:(int)tag withFrame:(CGRect)frame 
 UILabel *label = [[UILabel alloc] initWithFrame:frame];
 label.tag = tag;

 switch (tag) 
  case kNumberTag:
  case kDateTag:
   label.textAlignment = UITextAlignmentCenter;
   break;
  default:
   break;
 

 return [label autorelease];

问题是:

我可以通过使用 autoresizingMask 和/或 contentMode 属性来实现这种行为吗? 如果是,我应该更改哪些对象的属性以及更改为哪些值?

我进行了一些实验,但由于我是 iPad 编程新手,一直无法找到解决方案。提前致谢!

【问题讨论】:

【参考方案1】:
    CGRect frame = self.tableView.frame;
    CGFloat height1=120.0;
    [tableView setRowHeight:height1];
    self.tableView.frame = frame; 

这样您可以通过编程方式设置行高

【讨论】:

以上是关于以编程方式自动调整包含多个子视图的 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

当父容器视图约束以编程方式更改时,UINavigationController 子视图不调整大小

奇怪的 iOS 8 自动布局问题

在不自动调整大小的情况下确定 UIView 容器大小

使用故事板时需要以编程方式调整子视图的大小?

父 UIViewController 调整容器视图大小时,子视图控制器不自动布局

在 iPad 上以编程方式添加子视图,硬编码