在 iOS 7 中为 UITableViewCell 使用背景视图涵盖了默认删除按钮

Posted

技术标签:

【中文标题】在 iOS 7 中为 UITableViewCell 使用背景视图涵盖了默认删除按钮【英文标题】:Using background view for UITableViewCell in iOS 7 covers default delete button 【发布时间】:2013-10-01 04:59:10 【问题描述】:

我正在使用 UITableviewCell 的背景视图,这是一个图像视图,我正在使用图像视图来实现第一个和最后一个单元格的两个侧角。它工作正常但问题是当我使用这个背景视图时,当我们按下 tableviewcell 默认编辑按钮时出现的默认单元格删除按钮被背景视图覆盖。如果我为背景视图提供清晰的颜色,它正在工作很好,但我想设置背景视图。

是否知道为什么删除按钮被单元格背景视图覆盖或隐藏? 它发生在 ios 7 请帮忙!提前致谢。

【问题讨论】:

我在我的应用程序中也遇到了这个问题。尽我所能,这是一个 iOS 7 错误。我修复它的方法是设置一些自动布局约束以将我设置为单元格的backgroundViewUIImageView 的边缘固定到单元格的contentView。 (不要忘记将translatesAutoresizingMaskIntoConstraintsbackgroundView 设置为NO,这样你就可以使用自动布局约束。)这种方法效果很好,但我希望在未来的iOS 7 版本中看到这个问题(或者也许我们都错过了一些东西)。 谢谢@smileyborg :) UITableViewCell delete button gets covered up 的可能重复项 在描述我已实施的修复的文章中提供了正在发生的事情的可视化:sohail.io/2013/10/21/… iOS 7.0.3 已修复此问题。 【参考方案1】:

不使用背景视图怎么样。只需使用您的图像作为背景图案颜色尝试使用此

cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:YOUR_IMAGE]];

【讨论】:

我正在使用背景图像视图,因为我需要保留顶部的两个边缘角半径,如果我将它用作图案图像,那么图像将被重复,而不是我想拉伸它。谢谢【参考方案2】:

有完全相同的问题。通过在转换开始时将 backgroundView 发送到后面以及在下一个 runloop 周期(使用 dispatch_async)再次发送来解决它。

这是您应该添加到单元格类 .m 文件(即 MyCustomTableCellView.m)中的代码

// Fix for iOS7, when backgroundView comes above "delete" button
- (void)willTransitionToState:(UITableViewCellStateMask)state 
    [super willTransitionToState:state];
    [self sendSubviewToBack:self.backgroundView];
    dispatch_async(dispatch_get_main_queue(), ^
        [self sendSubviewToBack:self.backgroundView];
    );


- (void)didTransitionToState:(UITableViewCellStateMask)state 
    [super didTransitionToState:state];
    [self sendSubviewToBack:self.backgroundView];

【讨论】:

谢谢,我可以知道为什么你使用了两次 sendSubviewToBack 方法,一次在异步线程中? @Techie 是的,实际上,似乎在转换开始后添加了“删除”按钮,但在同一个运行循环周期中(有人调用“willTransitionToState”,然后立即添加删除按钮)。所以,首先 sendSubviewToBack 没有帮助,我们希望在主线程上发生的下一件事,在添加“删除”之后,就是 sendSubviewToBack。 dispatch_async 允许我们在当前函数完成后(在添加“删除”按钮后)几乎立即执行此操作 所以我们只能使用第二个,对吗?如果我错了,请纠正我。 今天是正确的,但 Apple 可能会在某个时候更改实施,因为这是一个 hack,最好保持安全 :) 如果我使用此代码,我的应用程序会被苹果拒绝吗?我可以使用此代码吗?这合法吗?【参考方案3】:

我今天在旧金山举行的 iOS 7 技术讲座活动中与 Apple UIKit 工程师进行了交谈,并确认这是一个开放的错误,Apple 将“很快”修复。

2013 年 10 月 22 日更新: iOS 7.0.3 修复了这个问题。

【讨论】:

再次感谢@smileyborg 我正在运行 iOS 7.0.3,但仍然遇到此问题。即使我正确调用了委托和数据源方法,单元格在滑动时也不会移动,并且删除按钮也不会出现,但是如果我点击删除按钮应该在的位置,它就会被删除。 在 7.0.4 上仍然看到这个 如果您仍然看到此问题,您需要发布示例项目/或至少发布示例代码...否则我们无法帮助调试。鉴于它对大多数其他人来说都是固定的,这可能是你做的不同或不正确的事情。【参考方案4】:

解决方法

我在 Apple 开发者论坛中找到了解决方法。我在此基础上处理了 backgroundViewselectedBackgroundView 的情况。

我仍然在生产 iOS7.0.2 中看到这个问题。但是,此解决方法很简单并且可以解决问题(对我而言)。将此代码放入您的自定义 UITableViewCell 子类中。

您也可以在此 gist 中找到它:https://gist.github.com/idStar/7018104

- (void)layoutSubviews 
    [super layoutSubviews];

    [self applyEditingModeBackgroundViewPositionCorrections];



/**
 When using a backgroundView or selectedBackgroundView on a custom UITableViewCell 
 subclass, iOS7 currently 
 has a bug where tapping the Delete access control reveals the Delete button, only to have 
 the background cover it up again! Radar 14940393 has been filed for this. Until solved, 
 use this method in your Table Cell's layoutSubviews
 to correct the behavior.

 This solution courtesy of cyphers72 on the Apple Developer Forum, who posted the
 working solution here: https://devforums.apple.com/message/873484#873484
 */
- (void)applyEditingModeBackgroundViewPositionCorrections 
    if (!self.editing)  return;  // BAIL. This fix is not needed.

    // Assertion: we are in editing mode.

    // Do we have a regular background view?
    if (self.backgroundView) 
        // YES: So adjust the frame for that:
        CGRect backgroundViewFrame = self.backgroundView.frame;
        backgroundViewFrame.origin.x = 0;
        self.backgroundView.frame = backgroundViewFrame;
    

    // Do we have a selected background view?
    if (self.selectedBackgroundView) 
        // YES: So adjust the frame for that:
        CGRect selectedBackgroundViewFrame = self.selectedBackgroundView.frame;
        selectedBackgroundViewFrame.origin.x = 0;
        self.selectedBackgroundView.frame = selectedBackgroundViewFrame;
    

我们在这里所做的基本上是在表格单元格布局时将这些背景视图的 x 原点重置为零,如果它们处于编辑模式。为什么它们翻译不正确,以及为什么它们高于 Apple 提供的“删除”按钮视图,这大概是 Apple 正在努力解决的已知问题的一部分。

【讨论】:

像大多数人一样,我在代码中设置了 backgroundView 和 selectedBackgroundView,因为它不能通过 Storyboard 原型单元格或专用于单个***项目(即表格单元格)的 Nib(我发现) .在代码中,无论我对添加的 backgroundView 应用 'translatesAutoresizingMaskIntoConstraints' YES 还是 NO,这种(错误的)行为都是一致的(将其保持为 YES 是有意义的,这样背景就可以延伸到覆盖单元格所需的任何内容) .【参考方案5】:

我遇到了同样的问题,终于得到了解决方案。试试这个: 而不是在cellForRowAtIndexPath(委托方法)中调用setBackgroundImage。打电话给willDisplayCell:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

    cell.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"cellList.png"]];

享受编码

【讨论】:

【参考方案6】:

试试下面的代码可能对你有帮助。

[youttablecell sendSubviewToBack:yourimageview]

【讨论】:

以上是关于在 iOS 7 中为 UITableViewCell 使用背景视图涵盖了默认删除按钮的主要内容,如果未能解决你的问题,请参考以下文章

在 PhoneGap Build 中为 iOS 7 启用 cookie

如何在同一应用程序中为 iOS 6 和 iOS 7 版本设置默认启动图像

我们现在可以在 Xcode 中为 iOS 7 制作动画图标吗?

在 iOS 7 中为 uinavigation 栏设置色调颜色而不中断栏按钮项目 [重复]

在 iOS 7 中为 UITableViewCell 使用背景视图涵盖了默认删除按钮

如何在iOS 7上的UITableViewCell左侧获得复选标记,就像在设置中一样?