6

当我将附件视图设置为 UITableViewCellAccessoryCheckmark 时,我试图将文本保持在 UITableViewCell 中。我也在这个课程中使用故事板。

这是我不想要的屏幕截图。

如何阻止文本向左缩进?

在此处输入图像描述

我的 willDisplayCell 方法..

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row == [self cellToCheckmark]) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else {
        NSLog(@"Not Being Checked");
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

cell.textLabel.textAlignment = UITextAlignmentCenter;

    if (cell.shouldIndentWhileEditing == YES) {
        cell.shouldIndentWhileEditing = NO;
    }
}

CellForRowAtIndexPath:

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

    UITableViewCell *cell = nil;

    static NSString *CellIdentifier = @"Cell";
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.textAlignment = UITextAlignmentCenter;

    if (indexPath.section == 0) {
        switch (indexPath.row) {
            case 0:
                cell.textLabel.text = @"Google";
                break;

            case 1:
                cell.textLabel.text = @"Bing";
                break;

            case 2:
                cell.textLabel.text = @"Yahoo!";
                break;

            default:
                break;
        }
    }

    if (indexPath.row == [self cellToCheckmark]) {
        NSLog(@"Being Checked");
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else {
        NSLog(@"Not Being Checked");
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    if (cell.shouldIndentWhileEditing == YES) {
        cell.shouldIndentWhileEditing = NO;
    }   
    return cell;
}
4

5 回答 5

9

你需要做两件事:

首先,您需要确保将表格样式设置为 Default: UITableViewCellStyleDefault。所有其他样式都detailTextLabel以一种或另一种方式使用 a,您将无法设置 textLabel 的对齐属性。

[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier:CellIdentifier]

然后您可以设置单元格的 textLabel 的对齐方式:

cell.textLabel.textAlignment = NSTextAlignmentCenter;

然后根据您的数据要求将附件设置为复选标记。

cell.accessoryType = ( myDataMatches ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone );

截屏

在此处输入图像描述

于 2012-05-31T21:47:26.433 回答
7

iOS 8+ 解决方案:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    cell.textLabel.text = ...;
    if (/* your condition */) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.layoutMargins = UIEdgeInsetsMake(0, 40, 0, 10);
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.layoutMargins = UIEdgeInsetsMake(0, 10, 0, 10);
    }
    return cell;
}
于 2015-12-10T21:42:54.217 回答
2

似乎有一个更简单的答案(参见这个答案)。简而言之,您将标签在单元格的内容视图中居中。相反,将它放在单元格本身的中心,然后它就不会移动。

试用了一下,它适用于 iOS 11.2。

在此处输入图像描述

于 2018-02-13T08:47:48.130 回答
1

这些解决方案适用于默认单元格。如果您有自己的自定义单元格,最简单的方法是让标签对左边距和右边距都有约束,然后为左边距约束创建一个出口,并在cellForRowAtIndexPath方法中设置其常量:

    cell.accessoryType = isChosen ? .checkmark : .none
    cell.leftMarginConstraint.constant = isChosen ? 40 : 0

这样,为您的附件类型添加的右边距也会被添加到左边。

于 2016-11-01T10:31:52.963 回答
0

不知道问题是否解决

if (/* your condition */) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
        cell.indentationLevel = 4;
    }else{
        cell.accessoryType = UITableViewCellAccessoryNone;
        cell.indentationLevel = 0;
    }
于 2015-05-11T09:54:20.457 回答