3

我按照 Apple 的文档将子视图添加到UITableViewcell 此处

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

这是我的代码:

- (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改为。UIViewAutoresizingFlexibleWidthNow when a cell is selected the Labels don't move to the left but are a little partially covered as in the pic below.在此处输入图像描述

也许这是由我造成的- (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;
    }
}
4

2 回答 2

0

我将从查看 Apple 的iOS 表视图编程指南开始。它有一个名为“仔细查看表格视图单元格”的部分,它分解了预定义单元格的布局。

查看您的代码 在您的单元格中进行的操作已经足够多,可以考虑将 UITableViewCell 子类化以生成您自己的自定义单元格。您可以将单元格标签的所有设置代码删除到一个类中,而只关心在cellForRowAtIndexPath:方法中配置单元格。

但是,您的问题集中在表格视图单元格的布局上。有时将子视图的背景设置为不同的颜色很有用,这样您就可以看到哪个子视图正在使用哪些空间以及如果我们引入其他子视图(在本例中为辅助视图)它如何交互。

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

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

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

于 2015-12-28T12:44:07.963 回答
-1

调整单元格的约束,使附件类型显示的那一侧不受任何约束。

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

于 2019-03-26T06:22:16.660 回答