UIView+CNLiveExtensions.swift 4.95 KB
//
//  UIView+CNGradient.swift
//  metaCode
//
//  Created by open on 2023/6/5.
//

import Foundation


extension UIView {
    
    private struct gradientLayerStr {
        static var gradient:String! = "kGradientLayer"
    }
    
    @discardableResult
    func setGradient(colors: [UIColor], startPoint: CGPoint, endPoint: CGPoint) -> CAGradientLayer {
        func setGradient(_ layer: CAGradientLayer) {
            self.layoutIfNeeded()
            var colorArr = [CGColor]()
            for color in colors {
                colorArr.append(color.cgColor)
            }
            CATransaction.begin()
            CATransaction.setDisableActions(true)
            layer.frame = self.bounds
            CATransaction.commit()
            
            layer.colors = colorArr
            layer.startPoint = startPoint
            layer.endPoint = endPoint
        }
        
        if let gradientLayer = objc_getAssociatedObject(self, &gradientLayerStr.gradient) as? CAGradientLayer {
            setGradient(gradientLayer)
            return gradientLayer
        } else {
            let gradientLayer = CAGradientLayer()
            self.layer.insertSublayer(gradientLayer, at: 0)
            setGradient(gradientLayer)
            objc_setAssociatedObject(self, &gradientLayerStr.gradient, gradientLayer, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            return gradientLayer
        }
    }
    
    
    /// 设置不同角度的圆角剪切
    /// - Parameters:
    ///   - conrners: 剪切方向
    ///   - radius: 剪切角度
    func addCorner(conrners: UIRectCorner, radius: CGFloat) {
        self.layoutIfNeeded()
        let maskPath = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: conrners, cornerRadii: CGSize(width: radius, height: radius))
        let maskLayer = CAShapeLayer()
        maskLayer.frame = self.bounds
        maskLayer.path = maskPath.cgPath
        self.layer.mask = maskLayer
    }
    
    
    public var left:CGFloat{
        
        set{
            
            var frame = self.frame
            
            frame.origin.x = newValue
            
            self.frame = frame
            
        }
        
        get{
            
            return self.frame.origin.x
            
        }
        
    }
    
    public var top:CGFloat{
        
        set{
            
            var frame = self.frame
            
            frame.origin.y = newValue
            
            self.frame = frame
            
        }
        
        get{
            
            return self.frame.origin.y
            
        }
        
    }
    
    public var right:CGFloat{
        
        set{
            
            var frame = self.frame
            
            frame.origin.x = newValue - frame.size.width
            
            self.frame = frame
            
        }
        
        get{
            
            return self.frame.origin.x + self.frame.size.width
            
        }
        
    }
    
    public var bottom:CGFloat{
        
        set{
            
            var frame = self.frame
            
            frame.origin.y = newValue - frame.size.height
            
            self.frame = frame
            
        }
        
        get{
            
            return self.frame.origin.y + self.frame.size.height
            
        }
        
    }
    
    public var centerX:CGFloat{
        
        set{
            
            self.center = CGPoint(x:newValue, y:self.center.x)
            
        }
        
        get{
            
            return self.center.x
            
        }
        
    }
    
    public var centerY:CGFloat{
        
        set{
            
            self.center = CGPoint(x:self.center.x, y:newValue)
            
        }
        
        get{
            
            return self.center.y
            
        }
        
    }
    
    public var width:CGFloat{
        
        set{
            
            var frame = self.frame
            
            frame.size.width = newValue
            
            self.frame = frame
            
        }
        
        get{
            
            return self.frame.size.width
            
        }
        
    }
    
   public var height:CGFloat{
        
        set{
            
            var frame = self.frame
            
            frame.size.height = newValue
            
            self.frame = frame
            
        }
        
        get{
            
            return self.frame.size.height
            
        }
        
    }
    

    public var origin:CGPoint{
        set{
            var frame = self.frame
            frame.origin = newValue
            self.frame = frame
        }
        
        get{
            return self.frame.origin
        }
    }
    
    public var size:CGSize {
        set{
            var frame = self.frame;
            frame.size = newValue;
            self.frame = frame;
        }
        
        get{
            return self.frame.size
        }
    }
}