UITableViewCell: rounded corners and shadow

前端 未结 14 1390
故里飘歌
故里飘歌 2020-12-02 05:05

I\'m changing the width of a UITableViewCell so that the cell is smaller but the user can still scroll along the edges of the tableview.

override func layout         


        
14条回答
  •  青春惊慌失措
    2020-12-02 05:11

    If it's useful, I have been using the code below to achieve this, which only needs to be run in cellForRowAt.

    First, add an extension to UITableViewCell to enable you to create a shadow and rounded corners on a TableViewCell:

    extension UITableViewCell {
        func addShadow(backgroundColor: UIColor = .white, cornerRadius: CGFloat = 12, shadowRadius: CGFloat = 5, shadowOpacity: Float = 0.1, shadowPathInset: (dx: CGFloat, dy: CGFloat), shadowPathOffset: (dx: CGFloat, dy: CGFloat)) {
            layer.cornerRadius = cornerRadius
            layer.masksToBounds = true
            layer.shadowColor = UIColor.black.cgColor
            layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
            layer.shadowRadius = shadowRadius
            layer.shadowOpacity = shadowOpacity
            layer.shadowPath = UIBezierPath(roundedRect: bounds.insetBy(dx: shadowPathInset.dx, dy: shadowPathInset.dy).offsetBy(dx: shadowPathOffset.dx, dy: shadowPathOffset.dy), byRoundingCorners: .allCorners, cornerRadii: CGSize(width: cornerRadius, height: cornerRadius)).cgPath
            layer.shouldRasterize = true
            layer.rasterizationScale = UIScreen.main.scale
            
            let whiteBackgroundView = UIView()
            whiteBackgroundView.backgroundColor = backgroundColor
            whiteBackgroundView.layer.cornerRadius = cornerRadius
            whiteBackgroundView.layer.masksToBounds = true
            whiteBackgroundView.clipsToBounds = false
            
            whiteBackgroundView.frame = bounds.insetBy(dx: shadowPathInset.dx, dy: shadowPathInset.dy)
            insertSubview(whiteBackgroundView, at: 0)
        }
    }
    

    Then just reference this in cellForRowAt:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "YourCellIdentifier", for: indexPath) as! YourCellClass
    
        cell.addShadow(backgroundColor: .white, cornerRadius: 13, shadowRadius: 5, shadowOpacity: 0.1, shadowPathInset: (dx: 16, dy: 6), shadowPathOffset: (dx: 0, dy: 2))
     
        // Or if you are happy with the default values in your extension, just use this instead:
        // cell.addShadow()
    
        return cell
    }
    

    Here is the result for me:

    Screenshot

提交回复
热议问题