如何创建具有边距、圆角和阴影的 UITableView?

Posted

技术标签:

【中文标题】如何创建具有边距、圆角和阴影的 UITableView?【英文标题】:How to create a UITableView with margins, rounded corners and shadow? 【发布时间】:2018-08-21 09:44:49 【问题描述】:

我正在用 Swift 开发一个应用程序。 在我的故事板中,我有一个 UITableViewController。我想为我的表格应用左右边距以及第一个/最后一个单元格上的圆角以及表格视图周围的阴影。

我尝试了很多选项,但找不到合适的解决方案。现在,我正在使用 UITableViewCell 的子类,我在其中覆盖框架以使其更窄。我可以有圆角,但我不能有阴影。

这是我的子类代码:

class NarrowTableCell: UITableViewCell 

  override var frame: CGRect 
      get 
          return super.frame
      
      set (newFrame) 
          var f = newFrame
          f.origin.x = 10
          if let w = superview?.frame.size.width 
              f.size.width = w - 20
           else 
              f.size.width = newFrame.size.width - 20
          
          super.frame = f
          super.layer.masksToBounds = true
      
  

  func applyNoCorners() 
      round(corners: [.topLeft, .topRight, .bottomLeft, .bottomRight], radius: 0)
  

  func applyCorners() 
      round(corners: [.topLeft, .topRight, .bottomLeft, .bottomRight], radius: 5)
  

  func applyTopCorners() 
      round(corners: [.topLeft, .topRight], radius: 5)
  

  func applyBottomCorners() 
      round(corners: [ .bottomLeft, .bottomRight], radius: 5)
  

我的大部分应用都是在 Storyboard 中完成的,我希望能够为动态和静态表格视图实现相同的结果。

我遇到的另一个问题是,当单元格框架更改时,我里面的标签没有正确更新。也就是说,它的内容被截断了。

这是我想做的:

【问题讨论】:

试试这个 > ***.com/questions/37645408/… 看这个->***.com/questions/3316424/… 【参考方案1】:

我使用 UIView 的扩展来管理圆角和阴影。由于变量是@IBInspectable,所以一切都可以直接在storyboard中设置!

import UIKit

extension UIView 

    @IBInspectable var shadow: Bool 
        get 
            return layer.shadowOpacity > 0.0
        
        set 
            if newValue == true 
                self.addShadow()
            
        
    

    @IBInspectable var cornerRadius: CGFloat 
        get 
            return self.layer.cornerRadius
        
        set 
            self.layer.cornerRadius = newValue

            // Don't touch the masksToBound property if a shadow is needed in addition to the cornerRadius
            if shadow == false 
                self.layer.masksToBounds = true
            
        
    


    func addShadow(shadowColor: CGColor = UIColor.black.cgColor,
               shadowOffset: CGSize = CGSize(width: 1.0, height: 2.0),
               shadowOpacity: Float = 0.4,
               shadowRadius: CGFloat = 3.0) 
        layer.shadowColor = shadowColor
        layer.shadowOffset = shadowOffset
        layer.shadowOpacity = shadowOpacity
        layer.shadowRadius = shadowRadius
    

从故事板上您可以打开或关闭阴影效果并提供角半径以供查看。您可以提供任何视图阴影或半径。

【讨论】:

嗨。感谢您的代码。我试过了,但它没有做我想要的。如果您查看我的屏幕截图,我需要将第一个单元格的顶角和最后一个单元格的底角四舍五入。如果我将cornerRadius 设置为UITableView,我什么也看不到。阴影也一样。 extension UIView func roundCorners(_corners: UIRectCorner, radius: CGFloat) let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners,cornerRadii: CGSize(width: radius, height: radius )) let mask = CAShapeLayer() mask.path = path.cgPath self.layer.mask = mask 像这样使用它我已经使用它来使我的图像从单元格 cell.homeCellImg.roundCorners([.bottomLeft, .topLeft], radius: 10.0) 的顶部 ldft 或左下角开始圆角/跨度>

以上是关于如何创建具有边距、圆角和阴影的 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 UICollectionViewCells 具有圆角和阴影?

具有角半径和阴影的 SWIFT UITableViewCell

Bootstrap中实现圆角圆形头像和响应式图片/css3圆角图片阴影效果总结

Swift - 圆角半径和阴影问题

可可绘制带圆角和阴影的图像

如何在CSS圆角上加个阴影效果?