15

我正在创建一个UITableViewwith custom UITableViewCell。iOS 7 的新删除按钮导致我的单元格布局出现一些问题。

如果我使用“编辑”按钮,这会使红色圆圈出现,我会遇到问题,但如果我滑动一个单元格,它看起来很完美。

这是使用编辑按钮的时候:

[self.tableView setEditing:!self.tableView.editing animated:YES];

内容与删除按钮重叠

这是我刷一个单元格的时候:

内容放置正确

如您所见,我的标签与第一个示例中的删除按钮重叠。为什么会这样,我该如何解决?

4

11 回答 11

7

尝试使用您的accessoryVieweditingAccessoryView属性UITableViewCell,而不是自己添加视图。

如果您希望在编辑和非编辑模式下都显示相同的指示器,请尝试将两个视图属性设置为指向同一个视图uiTableViewCell

self.accessoryView = self.imgPushEnabled;
self.editingAccessoryView = self.imgPushEnabled;

IOS7中的表格编辑动画似乎有问题,删除按钮和accessoryView切换回非编辑状态时重叠。这似乎在accesoryView指定 和editingAccessoryViewis时发生nil

此故障的解决方法似乎是指定一个不可见的editingAccessoryView,例如:

self.editingAccessoryView =[[UIView alloc] init];
self.editingAccessoryView.backgroundColor = [UIColor clearColor];
于 2013-09-26T09:26:47.650 回答
4

我已经通过设置没有宽度的约束解决了这个问题,只有前导和尾随

于 2014-01-09T17:59:04.590 回答
4

问题是在编辑模式下,单元格的 contentView 大小会发生变化。所以要么你必须layoutSubviews在你的单元格中覆盖并支持不同的帧大小

- (void) layoutSubviews
{
    [super layoutSubviews];
    CGRect contentFrame = self.contentView.frame;
    // adjust to the contentView frame
    ...
}

或者你上钩并切换到自动布局。

首先,我认为设置contentView.clipsToBoundsYES可能是一个丑陋的解决方法,但这似乎不起作用。

于 2013-10-22T16:33:02.023 回答
2

正如 tcurdt 提到的,您可以切换到自动布局来解决这个问题。但是,如果您(可以理解)不想仅仅为这个实例弄乱自动布局,您可以设置 autoresizingMask 并将其自动转换为适当的自动布局约束。

label.autoresizingMask = UIViewAutoresizingFlexibleWidth;
于 2014-02-06T17:25:56.903 回答
2

只需在您的自定义 TableViewCell 类中使用此方法即可获得完美答案,

这里selfUITableviewCell

- (void)layoutSubviews {

[super layoutSubviews];

    for (UIView *subview in self.subviews) {

    for (UIView *subview2 in subview.subviews) {

        if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view

            [subview bringSubviewToFront:subview2];

        }
     }
  }
}
于 2014-03-05T06:57:03.397 回答
2

如果有人想调整删除按钮大小,请使用以下代码

- (void)layoutSubviews {

    [super layoutSubviews];

    for (UIView *subview in self.subviews) {

        for (UIView *subview2 in subview.subviews) {

            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view

                CGRect rect = subview2.frame;
                rect.size.height = 47; //adjusting the view height
                subview2.frame = rect;

                for (UIButton *btn in [subview2 subviews]) {

                    if ([NSStringFromClass([btn class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) { // adjusting the Button height
                        rect = btn.frame;
                        rect.size.height = CGRectGetHeight(subview2.frame);
                        btn.frame = rect;

                        break;
                    }
                }

                [subview bringSubviewToFront:subview2];

            }
        }
    }
}
于 2014-03-07T08:09:50.730 回答
1

在 iPhone 上将自定义单元格放在前面UITableViewCellDeleteConfirmationViewlayoutSubviews我有用,但在 iPad 上却不行。

我在 iPadUITableView的主要部分有一个,在这种情况下,框架是 (768 0; 89 44),而不是 (320 0; 89 44)splitViewControllerUITableViewCellDeleteConfirmationView

所以我在layoutSubviews方法中调整了框架的大小,这对我有用

- (void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *subview in self.subviews) 
    {
        for (UIView *subview2 in subview.subviews) 
        {
            if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) 
            { 
                CGRect frame = subview2.frame;
                frame.origin.x = 320;
                subview2.frame = frame;
                [subview bringSubviewToFront:subview2];
           }
        }
    }
}
于 2014-03-06T13:52:41.307 回答
1

消除此问题的最佳方法是在单元格中添加图像并将其设置在背面。

      UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bgImg.png"]];
      imageView.frame = CGRectMake(0, 0, 320, yourCustomCell.frame.size.height);
      [yourCustomCell addSubview:imageView];
      [yourCustomCell sendSubviewToBack:imageView];

如果您的文本将与删除按钮重叠,则实施自动布局。它会以更好的方式管理它。

可以生成另一种情况,即 cellSelectionStyle 将使用默认颜色突出显示。您可以设置高亮颜色如下

      yourCustomCell.selectionStyle = UITableViewCellSelectionStyleNone;

将表格单元格的选择样式设置为 UITableViewCellSelectionStyleNone。这将删除蓝色背景突出显示或其他。然后,要使文本标签或内容视图突出显示以您想要的方式工作,请在您的CustomCell.m 类中使用此方法。

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    if (highlighted)
        self.contentView.backgroundColor = [UIColor greenColor];
     else
        self.contentView.backgroundColor = [UIColor clearColor];
}

我希望你能以更好的方式理解它。

于 2013-10-03T13:42:12.137 回答
1

如果您将内容放在 UITableViewCell 的 contentView 中,请确保您使用self.contentView.frame.size.width而不是self.frame.size.widthlayoutSubviews。

self.frame在编辑模式下扩展宽度,并将导致右侧的任何内容超出 contentView 的边界。self.contentView.frame保持正确的宽度(并且是您应该使用的)。

于 2016-08-20T16:29:14.743 回答
0

试试这个:可能是你在 cellForRowAtIndexPath (委托方法)中设置单元格 setBackgroundImage 。不要在这里设置。将您的图像设置为:

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellList.png"]]; }

享受编码。

于 2013-12-11T12:33:14.320 回答
0

我的解决方案是在显示删除按钮时将整个 contentView 向左移动:

override func layoutSubviews() {
    super.layoutSubviews()

    if editingStyle == UITableViewCellEditingStyle.Delete {
        var rect = contentView.frame
        rect.origin.x = self.showingDeleteConfirmation ? -15 : 38
        contentView.frame = rect
    }
}
于 2015-08-18T03:53:28.193 回答