我有一个表格视图,其中有五个单元格显示我的应用程序的设置。我希望前四个单元格出现在顶部。最后一个单元格实际上不是一个设置,它会显示“Legal”并将您带到EULA,所以我希望它显示在底部。
现在我知道我可以使用– tableView:viewForHeaderInSection:
和– tableView:heightForHeaderInSection:
来创建一些填充,但我真的不喜欢这种方式的硬编码。我也不想使用UIButton,因为我希望它与其他单元格完全一样。
有没有人知道解决这个问题的最佳做法?
答案 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是所有细胞的总数,包括透明细胞。您可能需要对此算法进行额外的工作,因为它没有考虑当单元格数量增长超出可见范围时会发生什么,并且我没有使用导航和工具栏的各种组合对其进行测试。
我希望这适合你。