显示复选标记附件视图移动表格内容

时间:2013-05-12 19:04:11

标签: ios uitableview custom-cell

我按照Apple的文档添加了UITableViewcell here

的子视图

向单元格添加第三个标签。问题是当我在右侧显示标准的复选标记附件视图时,即使我没有显示第3个标签,整个单元格内容也会向左移动。  pic下方的屏幕截图。

这是我的代码:

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

    static NSString *CellIdentifier = @"MyCell";

    UILabel *mainLabel, *secondLabel, *thirdLabel;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    //cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
    cell.accessoryType = UITableViewCellAccessoryNone;

    mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 2.0, 100.0, 21.0)];
    mainLabel.tag = MAINLABEL_TAG;
    //mainLabel.font = [UIFont systemFontOfSize:14.0];
    //mainLabel.font = [UIFont fontWithName:@"Geeza Pro Bold" size:17.0];
    mainLabel.font = [UIFont boldSystemFontOfSize:17];
    mainLabel.textAlignment = UITextAlignmentLeft;
    mainLabel.textColor = [UIColor blackColor];
    mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:mainLabel];

    secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 22.0, 100.0, 21.0)];
    secondLabel.tag = SECONDLABEL_TAG;
    //secondLabel.font = [UIFont systemFontOfSize:12.0];
    //secondLabel.font = [UIFont fontWithName:@"Geeza Pro" size:15.0];
    secondLabel.font = [UIFont systemFontOfSize:15];
    secondLabel.textAlignment = UITextAlignmentLeft;
    secondLabel.textColor = [UIColor darkGrayColor];
    secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:secondLabel];

    thirdLabel = [[UILabel alloc] initWithFrame:CGRectMake(203.0, 11.0, 70.0, 21.0)];
    thirdLabel.tag = THIRDLABEL_TAG;
    //thirdLabel.font = [UIFont systemFontOfSize:12.0];
    //thirdLabel.font = [UIFont fontWithName:@"Geeza Pro Bold" size:17.0];
    thirdLabel.font = [UIFont boldSystemFontOfSize:17];
    thirdLabel.textAlignment = UITextAlignmentRight;
    thirdLabel.textColor = [UIColor darkGrayColor];
    thirdLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
    [cell.contentView addSubview:thirdLabel];


}
    else
    {
        mainLabel = (UILabel *)[cell.contentView viewWithTag:MAINLABEL_TAG];
        secondLabel = (UILabel *)[cell.contentView viewWithTag:SECONDLABEL_TAG];
        thirdLabel = (UILabel *)[cell.contentView viewWithTag:THIRDLABEL_TAG];
    }

    Car *car = [self.dataModel carAtIndex:indexPath.row];
   NSString *carName = [NSString stringWithFormat:@"%@",car.deviceName];
   NSString *carDetails = [NSString stringWithFormat:@"%@ at %@",car.date,car.location];
   NSString *carSpeed = [NSString stringWithFormat:@"%@ km/h",car.speed];


   mainLabel.text = carName;
   secondLabel.text = carDetails;
   thirdLabel.text = carSpeed;

return cell;
}

更新:我根据@MattG建议将UIViewAutoresizingFlexibleLeftMargin更改为UIViewAutoresizingFlexibleWidth。现在,当选择一个单元格时,标签不会向左移动,但会有一些部分覆盖,如下图所示。 enter image description here

也许这是由- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath引起的?这是它的代码:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath    *)indexPath
{

    if([tableView cellForRowAtIndexPath:indexPath].accessoryType == UITableViewCellAccessoryCheckmark){
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryNone;
    }
    else
    {
        [tableView cellForRowAtIndexPath:indexPath].accessoryType = UITableViewCellAccessoryCheckmark;
    }
}

2 个答案:

答案 0 :(得分:0)

我首先回顾一下Apple的Table View Programming Guide for iOS。它有一个名为' A Closer Look at Table View Cells'它打破了预定义单元格的布局。

查看代码在单元格中有足够的内容可以考虑将UITableViewCell子类化以生成自己的自定义单元格。您可以将单元格标签的所有设置代码删除到一个类中,只关注自己使用cellForRowAtIndexPath:方法配置单元格。

但是,您的问题主要集中在表格视图单元格的布局上。设置子视图有时很有用。不同颜色的背景,以便您可以看到哪个空间被哪个子视图使用,以及如果我们引入其他子视图,它们如何相互作用,在这种情况下是附件视图。

要解决第三个标签被截断的文本问题,首先要将标签配置为使用较小的字体大小。我会为所有标签做这个。现在,标签应根据标签的宽度调整文本。您还应检查文本对齐属性以确认它们已设置为最佳选项。

thirdLabel.adjustsFontSizeToFitWidth = YES;
thirdLabel.minimumScaleFactor = 0.4f;

这些更改的结果可能足以解决截断并保持您拥有的布局。

答案 1 :(得分:0)

调整单元格的约束,以使附件类型不出现在那一侧。

例如,我的附件出现在右侧,但是我的单元格项目限制在所有4个边缘(顶部,底部,左侧,右侧)。由于附件是正确的复选标记,因此我将项目更改为顶部,左侧,高度和宽度限制,(跳过了右侧),现在,当附件出现时,它不会移动右侧锚点。