如何在旋转后更改自定义viewForHeaderInSection宽度

时间:2012-09-28 11:28:07

标签: ios uitableview

我必须构建一个自定义的tableViewHeader,其中至少应显示两个标签,即。 projectName和projectDescription。这两个标签的内容各不相同(即就字符串长度而言)。

我设法获得默认设备方向(纵向)的工作版本,但如果用户将设备旋转到横向,则不会调整自定义headerView的宽度,并且用户将看到右侧未使用的空白区域。 / p>

正在使用以下代码片段:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return 50.0f;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{    
    CGFloat wd = tableView.bounds.size.width;
    CGFloat ht = tableView.bounds.size.height;
    UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0., 0., wd, ht)];
    headerView.contentMode = UIViewContentModeScaleToFill;
    // Add project name/description as labels to the headerView.
    UILabel *projName = [[UILabel alloc] initWithFrame:CGRectMake(5., 5., wd, 20)];
    UILabel *projDesc = [[UILabel alloc] initWithFrame:CGRectMake(5., 25., wd, 20)];
    projName.text = @"Project: this project is about an interesting ..";
    projDesc.text = @"Description: a very long description should be more readable when your device is in landscape mode!";
    [headerView addSubview:projName];
    [headerView addSubview:projDesc];
    return headerView;
}

我注意到tableView:viewForHeaderInSection:只会在viewDidLoad后调用一次,但在设备方向更改后不会调用。

我应该使用类似的方法实现willRotateToInterfaceOrientation:方法:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                                duration:(NSTimeInterval)duration
{
    [self.tableView reloadSections:nil withRowAnimation:UITableViewRowAnimationNone];
}

我无法弄清楚如何让reloadSections:工作,强制重新计算我的customView。

1 个答案:

答案 0 :(得分:7)

如果使用autoresizingMask,则标题会在旋转时正确调整。无需覆盖任何其他内容。我会在返回视图之前在代码的末尾设置自动掩码:

    [headerView addSubview:projName];
    [headerView addSubview:projDesc];
    projName.autoresizingMask = UIViewAutoresizingFlexibleRightMargin;
    projDesc.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
    headerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    return headerView;