【问题标题】:Rounded UITableViewCell only bottom or top corners but it doesn't work Swift iOS 10圆形 UITableViewCell 仅底角或顶角,但它不起作用 Swift iOS 10
【发布时间】:2018-06-06 11:39:12
【问题描述】:

我想像这样将 2 个 UITableViewCell 的顶角和底角弄圆:这就是我在 iOS 11 上得到的

What I want

但我在 iOS 10 上得到了这个:

Result rectShape.bounds = self.bounds

使用该代码:

蓝色视图的UITableViewCell

import UIKit

class ProductDescriptionTableViewCell: UITableViewCell {

var ProductDescription: UITextView!
public var container: UIView!

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
    // Set the width of the cell
   self.bounds = CGRect(x: self.bounds.origin.y + 16, y: self.bounds.origin.y, width: self.bounds.size.width - 16, height: self.bounds.size.height)

    super.layoutSubviews()
}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.backgroundColor = UIColor.blue
    if #available(iOS 11.0, *) {
        self.layer.masksToBounds = true
        self.layer.cornerRadius = 10
        self.layer.maskedCorners = [.layerMinXMaxYCorner, .layerMaxXMaxYCorner]
    } else {
        let rectShape = CAShapeLayer()
        rectShape.bounds = self.bounds// CGRect(x: self.bounds.origin.x + 16, y: self.bounds.origin.y, width: self.bounds.size.width - 16, height: self.bounds.size.height)
        rectShape.position = self.center
        rectShape.path = UIBezierPath(roundedRect:  rectShape.bounds, byRoundingCorners: [.bottomRight, .bottomLeft], cornerRadii: CGSize(width: 10, height: 10)).cgPath

        self.layer.backgroundColor = UIColor.red.cgColor
        //Here I'm masking the textView's layer with rectShape layer
        self.layer.mask = rectShape
    }
}
}

紫色视图的UITableViewCell

import UIKit

class ProductTitleTableViewCell: UITableViewCell {

var ProductTitle: UILabel!

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func layoutSubviews() {
    // Set the width of the cell
    self.bounds = CGRect(x: self.bounds.origin.y + 16, y: self.bounds.origin.y, width: self.bounds.size.width - 16, height: self.bounds.size.height)

    super.layoutSubviews()
}

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    self.backgroundColor = UIColor.purple

    if #available(iOS 11.0, *) {
        self.layer.masksToBounds = true
        self.layer.cornerRadius = 10
        self.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
    } else {
        let rectShape = CAShapeLayer()
         rectShape.bounds = self.bounds//CGRect(x: self.bounds.origin.x + 16, y: self.bounds.origin.y, width: self.bounds.size.width - 16, height: self.bounds.size.height)
         rectShape.position = self.center
         rectShape.path = UIBezierPath(roundedRect:  rectShape.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 10, height: 10)).cgPath

         self.layer.backgroundColor = UIColor.green.cgColor
         //Here I'm masking the textView's layer with rectShape layer
         self.layer.mask = rectShape
    }
}
}

如果我在评论中用 CGRect 替换 self.bounds 我得到了:

With rectShape.bounds = CGRect(x: self.bounds.origin.x + 16, y: self.bounds.origin.y, width: self.bounds.size.width - 16, height: self.bounds.size.height)

我尝试在 init() 开头更改 self.bounds,但它也不起作用

我还尝试将更改角的代码放在 layoutSubviews() 中,但在这种情况下 UITableViewCell 消失

我没有一个只使用一个 UITableViewCell 和圆角我真的需要圆底角和顶角以分隔 UITableViewCell

如果您知道我该如何解决,我将不胜感激 感谢您的宝贵时间

【问题讨论】:

    标签: ios swift uitableview rounded-corners


    【解决方案1】:

    添加以下扩展:

    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
    }
    

    然后从布局子视图中调用它,如下所示:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        headerView.roundCorners([UIRectCorner.topLeft, UIRectCorner.topRight], radius: kTableViewCornerRadius)
    }
    

    【讨论】:

      【解决方案2】:

      嗯,我正在使用 UIView 这个非常简单的扩展来制作圆角。在 cellForRowAt 委托方法中,将单元格出列后,只需调用

      cell.makeCornersRound()
      

      extension UIView {
      
        public func makeCornersRound () {
      
          self.layer.cornerRadius = 8
          self.clipsToBounds = true
      
        }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        相关资源
        最近更新 更多