如何仅为图层的左下角、右下角和左上角设置圆角?

90

如何仅为TextView的左下角、右下角和左上角设置圆角?

let rectShape = CAShapeLayer()
rectShape.backgroundColor = UIColor.redColor().CGColor
rectShape.bounds = messages.frame
rectShape.position = messages.center
rectShape.path = UIBezierPath(roundedRect: messages.bounds, byRoundingCorners: .BottomLeft | .TopRight, cornerRadii: CGSize(width: 20, height: 20)).CGPath

messages.layer.addSublayer(rectShape)

这段代码创建了两个矩形,但我不知道为什么。


在这段代码中,你不是添加遮罩,而是将rectshape作为消息textView的子层添加。 - Shailesh Chandavar
Zept,这有意义吗? - Shailesh Chandavar
https://dev59.com/Hl0Z5IYBdhLWcg3wpRlW - Kirit Modi
13个回答

4
extension UIView {

func roundCorners(_ corners: CACornerMask, radius: CGFloat) {
    if #available(iOS 11, *) {
        self.layer.cornerRadius = radius
        self.layer.maskedCorners = corners
    } else {
        var cornerMask = UIRectCorner()
        if(corners.contains(.layerMinXMinYCorner)){
            cornerMask.insert(.topLeft)
        }
        if(corners.contains(.layerMaxXMinYCorner)){
            cornerMask.insert(.topRight)
        }
        if(corners.contains(.layerMinXMaxYCorner)){
            cornerMask.insert(.bottomLeft)
        }
        if(corners.contains(.layerMaxXMaxYCorner)){
            cornerMask.insert(.bottomRight)
        }
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: cornerMask, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
}

}


这应该是最新的iOS版本的可接受答案,谢谢,它对我有用。 - ANeme

1

问题已解决,现在右上角和右下角可以正常工作。

代码已在iOS 9、10、11版本中进行了测试。

 extension UIView {
        func roundCorners(_ corners:UIRectCorner,_ cormerMask:CACornerMask, radius: CGFloat) {
            if #available(iOS 11.0, *){
                self.clipsToBounds = false
                self.layer.cornerRadius = radius
                self.layer.maskedCorners = cormerMask
            }else{
                let rectShape = CAShapeLayer()
                rectShape.bounds = self.frame
                rectShape.position = self.center
                rectShape.path = UIBezierPath(roundedRect: self.bounds,    byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath
                self.layer.mask = rectShape
            }
        }
        
    }

无法在IOS 9上工作。角落边框在半径部分被切割。 - Jaydeep Patel

0

正如@kazi.munshimun提出的只读设置建议一样,这是很棒的,但我不想为此创建一个完整的视图,我正在寻找一个仅有的cornerRadius字段。

因此,我想到了标志组合的想法,例如BottomLeft(4) + BottomRight(8) = 12

因此,在您的视图上设置数字组合从0(无)到15(所有角落)+启用clipsToBounds即可。就是这样!通过文件完全可定制。

此解决方案示例适用于iOS 11.0+(Swift 4+),可以适应较低版本:

extension UIView {
    enum CornerEnum: Int  {
        case None = 0
        case TopLeft = 1
        case TopRight = 2
        case BottomLeft = 4
        case BottomRight = 8
    }
    
    @IBInspectable
    var radiusCorners: Int {
        set {
            var corners = CACornerMask()
            if(newValue & CornerEnum.TopLeft.rawValue != 0){
                corners.insert(.layerMinXMinYCorner)
            }
            if(newValue & CornerEnum.TopRight.rawValue != 0){
                corners.insert(.layerMaxXMinYCorner)
            }
            if(newValue & CornerEnum.BottomLeft.rawValue != 0){
                corners.insert(.layerMinXMaxYCorner)
            }
            if(newValue & CornerEnum.BottomRight.rawValue != 0){
                corners.insert(.layerMaxXMaxYCorner)
            }
            layer.maskedCorners = corners
        }
        get { return self.radiusCorners }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接