我有一个表格视图,每个单元格都包含一个按钮。在所有iOS版本中都可以很好地工作,但在7版本中出现问题。我不知道是怎么回事。该单元格是在一个xib文件中构建的。
能否有人给我一些建议?提前致谢。
我有一个表格视图,每个单元格都包含一个按钮。在所有iOS版本中都可以很好地工作,但在7版本中出现问题。我不知道是怎么回事。该单元格是在一个xib文件中构建的。
能否有人给我一些建议?提前致谢。
对我有效的方法是:
contentView.userInteractionEnabled = NO;
在从nib文件加载自定义单元格后调用。看起来这个内容视图是在创建nib文件中定义的视图之后创建并设置为顶级子视图。
我从nib中加载单元格后,调用[cell bringSubviewToFront:button]
解决了这个问题。
contentView
子视图,用于响应单元格触摸事件。如果这个视图位于你的按钮之上,它将会接收触摸事件而不是按钮。bringSubviewToFront
确保你的按钮在视图堆栈的顶部。 - devios1我之前也遇到过这个问题,花了很多时间在stackoverflow和互联网上研究不同的答案。解决方法取决于问题的来源。对于大多数情况,您需要对应该接受用户操作(轻点/点击等)的元素执行以下操作:
myButton.userInteractionEnabled = YES;
特别是对于UILabel / UIImageView,默认情况下,userInteractionEnabled
标志为 NO
。
如果您从xib加载视图,您需要确保来自自定义单元格视图、内容视图和要启用用户操作的元素的所有复选框都已选中:
在上面的示例中,DeviceViewCell、Content View和Button元素都选中了"User Interaction Enabled" 复选框。
如果自定义单元格作为UITableViewCell的子类实现,并且自定义单元格视图是动态从另一个xib文件加载的,则您还必须执行另一件事情,这对大多数人来说可能很困惑,但我稍后会解释为什么:
在自定义单元格的初始化方法中,您需要执行以下操作:
self.contentView.userInteractionEnabled = NO
其中self
是您创建的UITableViewCell子类。再次强调,如果自定义单元格作为UITableViewCell的子类实现,并且自定义单元格视图是动态从另一个xib文件加载的,则需要执行上述操作。这里是解释:
self.contentView
不是您在Interface Builder中看到的那个内容视图(Content View)
,它是由系统创建的默认内容视图(default content view)
,位于自定义单元格视图内的所有其他视图/元素之上,遮挡了视图层次结构中的其余部分。因此,在自定义单元格视图中的UI元素可以接收用户交互事件之前,您需要禁用它的用户交互。希望这有所帮助。如果您有更好的解释,我很乐意听取 :-)。再次强调,这是我的观察结果,可能存在其他原因。欢迎讨论!
self.contentView
的观察非常明智。那是根本原因。 - Tchelowfunc tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
cell.bringSubviewToFront(cell.YOUR_UIView)
}
这对我很有效。
显然,有很多问题可能会出现,而某些修复方法只适用于特定的iOS版本,而其他版本则不可行。
我的问题是,我有一个UIButton,它不是cell.contentView的直接子视图(即它是子视图的子视图)。我必须直接将我的按钮添加到cell.contentView中,以使其可点击。(适用于iOS v8+)
我遇到了同样的问题。原来是我在IB中创建了一个UIView对象,然后将其类设置为UITableViewCell的子类。
由于我最初在IB中创建的对象是UIView,因此UITableViewCell的contentView直到运行时才被添加,这恰好位于我的UIButtons之上,使它们无法被选中。
我一直遇到同样的问题。原因是
self.contentView.Frame.size.height
始终是44。
有一个建议是,在重写方法(void)layoutSubviews
时,您可以将self.contentView.Frame
设置为self.frame
,问题就会得到解决。
在我的情况下,我希望用户与之交互的所有内容都在ContentView之外。此外,当选中单元格时,我不希望该单元格被突出显示。
所有标签(名称、类别等)都紧接在“内容视图”下方。WebsiteButton不在“内容视图”下,但它在“本地目录表格单元格”下。
在我的tableViewController方法tableView:cellForRowAtIndexPath:中,我有以下代码: cell.contentView.userInteractionEnabled = NO;
这就是全部内容,用户能够与按钮进行交互。 我没有使用[cell bringSubviewToFront:cell.websiteButton];
myButton.setBackgroundImage(UIImage(named: "ButtonBackgroundSelected.png"), forState: .Highlighted)