何时需要在转换iOS后重置view.frame属性

时间:2011-10-14 18:34:45

标签: iphone ios uitableview pulse

我正在制作像Pulse新闻阅读器一样的水平表视图。我在网上找到了几个例子,并且有效,但我想知道何时需要在转换后设置view.frame属性。

我发现的示例在90度旋转后重置垂直表格视图单元格中水平表格视图的框架

self.tableViewCell.horizontalTableView.transform = rotateTable;
self.tableViewCell.horizontalTableView.frame = CGRectMake(0, 0, self.tableViewCell.horizontalTableView.frame.size.width, self.tableViewCell.horizontalTableView.frame.size.height);

更多背景信息:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
TableViewCell *cell = (TableViewCell*)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TableViewCell" owner:self options:nil];

    CGAffineTransform rotateTable = CGAffineTransformMakeRotation(-M_PI_2);
    self.tableViewCell.horizontalTableView.transform = rotateTable;
    self.tableViewCell.horizontalTableView.frame = CGRectMake(0, 0, self.tableViewCell.horizontalTableView.frame.size.width, self.tableViewCell.horizontalTableView.frame.size.height);

    self.tableViewCell.contentArray = [self.arrays objectAtIndex:indexPath.section];

    self.tableViewCell.horizontalTableView.allowsSelection = YES;
    cell = self.tableViewCell;
    self.tableViewCell = nil;

}

cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;

}

但是在单元格转换(旋转)之后不要重置水平表格单元格的框架:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.horizontalTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {

    [[NSBundle mainBundle] loadNibNamed:@"GameTableViewCell" owner:self options:nil];
    cell = self.gameTableCell;
    self.gameTableCell = nil;
}

CGAffineTransform rotateImage = CGAffineTransformMakeRotation(M_PI_2);
cell.transform = rotateImage;
return cell;

}

我尝试重置单元格的框架,它对输出没有影响,即使我提供了

cell.frame = CGMakeRect(200, 200, cell.frame.size.height, cell.frame.size.width)

哪个应该在桌面视图周围移动单元格,不是吗?

如果我没有重置self.tableViewCell.horizontalTableView.frame的帧,则水平表会旋转,但位置错误。

为什么我需要在旋转后重置水平表视图的帧,而不是单个单元格(也是旋转的)?

谢谢!

// iPortable的插图
enter image description here

2 个答案:

答案 0 :(得分:0)

我在解决你所有的问题时遇到了问题,但我会尽力而为 旋转设备时,表视图大小会更改(框架)。因此,您必须为表视图设置新帧以完成新的“设计”(将表视图拉伸到整个宽度)。对于单元格而言,情况并非如此,因为即使在旋转之后它们也保持相同的大小 一个例子:

________
|______| -> a cell width: 50 height: 200
旋转后

___
| |
| | -> still the same size, width: 50 height: 200
|_|

CGAffineTransform只是一种视觉效果。它的大小既不会影响其子视图的位置,也不会影响其大小。因此,您必须为您的单元格执行完全相反的旋转,然后才能进行表格视图。旋转的方向是错误的?颠倒,左,右,还是使用边缘进行旋转,以便选择错误的旋转点?

答案 1 :(得分:0)

啊,好好再读一遍后,我明白你在问什么^^

  1. 设置框架会导致重绘视图。这需要完成,因为否则旧图形可能会干扰并且看起来很丑陋。重绘也应该锐化绘制线。
  2. 您将单元格的框架设置为位于其他位置(此处为200,200),但它没有任何效果是完全正常的。单元格不能是CGPointZero以外的其他单元格。如果您想取代它,则必须创建更大的视图并移动内容。 (视图可以是半透明的,但它会大大减慢旧设备的滚动速度)
  3. 你问为什么你不必重绘每个单元格而只重绘tableView。实际上我并不完全知道这一点,但事实上它应该是表格视图的框架更改。通常,通过旋转设备以使宽度改变来发生帧改变。现在,对于开发人员来说,为新大小更新每个单元格将是非常愚蠢的。感谢Apple,tableView为屏幕上可见的每个单元调用必要的更新请求。最终,所有视图都会调用相同的方法:drawRect: