【问题标题】:Shadow not conforming to the shape of view in UITableViewCell阴影不符合 UITableViewCell 中视图的形状
【发布时间】:2016-06-22 07:09:27
【问题描述】:

我有一个表格视图,我试图在其中添加卡片式单元格。为了实现这一点,我在单元格的内容视图上添加了一个 UIView (paddingView),尺寸略小于它。现在要创建阴影效果,我使用以下代码:

    let path = UIBezierPath(rect: cell.paddingView.bounds)
    cell.paddingView.layer.shadowPath = path.CGPath
    cell.paddingView.layer.shadowOffset = CGSizeMake(0.5, 0.5)
    cell.paddingView.layer.shadowOpacity = 0.4

第一次加载表格视图时会出现问题。每个单元格下的阴影如下所示:

这是我滚动一次时的样子 如何确保阴影效果正确,而不像上图?

【问题讨论】:

  • 你在哪里调用创建影子的代码?
  • 在 cellForRowAtIndexPath 中。
  • 试试tableView(_:willDisplayCell:forRowAtIndexPath:)
  • @Desdenova 不幸的是,我得到了相同的结果

标签: ios swift uitableview shadow


【解决方案1】:

您在第一次加载时看到的错误阴影宽度问题与使用paddingView 的边界单元格的子视图布局之前。

当一个单元格被实例化时,它可能会以错误的初始宽度(基于情节提要)开始,而不是最初设置为 tableView 的实际宽度。

问题在滚动到屏幕后消失的原因是重复使用的单元格具有正确的paddingView 边界宽度,因此阴影现在看起来是正确的。

这是一个常见的问题,因为在表格被(滚动或)重新加载之前,最初没有正确布置自定尺寸单元格。 several workarounds 可以追溯到将近两年前,从重新加载表格到强制布局通过。

两者都确保单元格初始宽度在第一次使用时是正确的。

如果您支持旧版本的 iOS,则可能会出现此问题。我不记得哪个确切版本的 iOS 修复了它,但我已经有一段时间没有解决这个问题了。

【讨论】:

  • 感谢您的回答!您指向几种解决方法的链接解决了我的问题!我只需在 cellForRowAtIndexPath 中添加以下代码: cell.contentView.bounds = cell.bounds cell.layoutIfNeeded()
【解决方案2】:

问题似乎是storyboard中的frame和runtime中的frame有区别。

因此,当您推出时,它就成功了。 因为布局被刷新了。

尝试将此代码添加到函数cellForRowAtIndexPath

cell.setNeedsLayout()

cell.layoutIfNeeded()

【讨论】:

  • 感谢您的回答!如果我还在 cell.layoutIfNeeded 之前添加 cell.contentView.bounds = cell.bounds ,则此方法对我有用
【解决方案3】:

试试这个

    cell.vwMain.layer.shadowOffset = CGSize(width: 0, height: 5)
    cell.vwMain.layer.shadowOpacity = 0.05
    cell.vwMain.layer.shadowRadius = 5

    cell.layer.shadowOffset = CGSizeMake(0.0, 5);
    cell.layer.shadowOpacity = 0.2;
    cell.layer.shadowRadius = 5;

这会给你一个卡片风格的效果

【讨论】:

    【解决方案4】:

    将新单元格添加到屏幕外的表格时,阴影问题完全相同。这听起来像是错误的shadowPath,因为当单元格出现在屏幕外时,它的边界稍微不正确。

    找到了两种适用于我的解决方案:

    解决方案 1:将 tableView.reloadData() 更改为

    tableView.reloadData()
    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()
    tableView.reloadData()
    

    解决方案 2:根本不设置 shadowPath,我的意思是简单地从示例代码中删除它就可以了:

    // cell.paddingView.layer.shadowPath = path.CGPath
    

    shadowPath 主要用于提高性能。不设置会动态计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-02
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 2015-12-30
      • 1970-01-01
      相关资源
      最近更新 更多