将细胞对准UITableView的底部和顶部,在中间留下可拉伸的间隙

时间:2010-03-05 06:15:56

标签: iphone uitableview layout

我有一个表格视图,其中有五个单元格显示我的应用程序的设置。我希望前四个单元格出现在顶部。最后一个单元格实际上不是一个设置,它会显示“Legal”并将您带到EULA,所以我希望它显示在底部。

现在我知道我可以使用– tableView:viewForHeaderInSection:– tableView:heightForHeaderInSection:来创建一些填充,但我真的不喜欢这种方式的硬编码。我也不想使用UIButton,因为我希望它与其他单元格完全一样。

有没有人知道解决这个问题的最佳做法?

1 个答案:

答案 0 :(得分:13)

我假设您正在使用分组表视图,例如设置应用。我所做的是在顶部和底部组部分之间创建了一个组部分,我添加了一个“透明”行单元格,我动态调整大小。

我使用硬编码值为您创建了一个简单的演示,但希望您能理解。显然,您将获得数据结构中的节数和行数:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 3; 
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    int rtn = 0;

    if (section == 0)
        rtn = 4;
    else if (section == 1)
        rtn = 1;
    else if (section == 2)
        rtn = 1;

    return rtn;
}

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

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

    int TOTALCELLS = 6;
    float CONSTANT = 0.5f;

    if (indexPath.section == 1) 
        return  self.view.frame.size.height - (44.0f * (CONSTANT + TOTALCELLS));

    return 44.0f;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

    }



    if (indexPath.section == 0) 
    {
        if (indexPath.row == 0) {

            cell.textLabel.text = @"My Switch";
            UISwitch *boolSwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
            boolSwitch.on =  YES;
            [cell setAccessoryView:boolSwitch];
            [boolSwitch release];

        } else if (indexPath.row == 1) {

            cell.textLabel.text = @"My TxtField";
            [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
            UITextField *txtField = [[UITextField alloc]initWithFrame:CGRectMake(0,0,175,20)]; 
            txtField.text =  @"Default Value";
            txtField.textColor = [UIColor darkGrayColor];
            [txtField setClearButtonMode:UITextFieldViewModeAlways];
            [cell setAccessoryView:txtField];
            [txtField release];

        } else if (indexPath.row == 2) {

            cell.selectionStyle=UITableViewCellSelectionStyleNone;
            UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0,0,280,22)];
            slider.minimumValue  = 0.0f;
            slider.maximumValue = 10.0f;
            slider.value =  0.7f;
            slider.minimumValueImage = [UIImage imageNamed:@"minus.png"];
            slider.maximumValueImage = [UIImage imageNamed:@"plus.png"];
            [cell setAccessoryView:slider];
            [slider addTarget:self action:@selector(sliderChange:forEvent:) forControlEvents:UIControlEventValueChanged];
            [slider release];

        } else if (indexPath.row == 3) {

            cell.textLabel.text = @"My MultiValue";
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.detailTextLabel.text = @"Default selection";
        }

    } else if (indexPath.section == 1) {

        UIView *transCell = [[UIView alloc] initWithFrame:CGRectZero];
        transCell.backgroundColor = [UIColor clearColor];
        cell.backgroundView = transCell; 
        [transCell release];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    } else if (indexPath.section == 2) {

        cell.textLabel.text = @"Legal";
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }



    return cell;
}

关键部分位于cellForRowAtIndexPath中,其中创建了透明行。这里的技巧是将透明视图添加到单元格的backgroundView,并将单元格选择样式设置为无。

UIView *transCell = [[UIView alloc] initWithFrame:CGRectZero];
transCell.backgroundColor = [UIColor clearColor];
cell.backgroundView = transCell; 
[transCell release];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

并在heightForRowAtIndexPath中,透明行的动态大小调整。

self.view.frame.size.height - (44.0f * (CONSTANT + TOTALCELLS));

TOTALCELLS是所有细胞的总数,包括透明细胞。您可能需要对此算法进行额外的工作,因为它没有考虑当单元格数量增长超出可见范围时会发生什么,并且我没有使用导航和工具栏的各种组合对其进行测试。

我希望这适合你。

Valid XHTML