【发布时间】:2019-06-22 01:30:02
【问题描述】:
在我的项目中,我有多个渐变视图,它们具有不同的颜色以及不同的起点和终点。一些渐变视图也有带角半径的阴影。
出于这个原因,我为每个渐变要求创建了多个视图类型。每个GradiantView 在多个地方使用。
例如:
struct ApplyGradiantView {
var GradiantLayer : CAGradientLayer?
init(frame:CGRect,Colors:[CGColor],startPoint:CGPoint,endPoint:CGPoint) {
GradiantLayer = CAGradientLayer()
GradiantLayer?.colors = Colors
GradiantLayer?.startPoint = startPoint
GradiantLayer?.endPoint = endPoint
GradiantLayer?.frame = frame
}
}
和
class blueGradiantView : UIView {
var gradiant1Colour = AppColor.gradiantColor1.cgColor
var gradiant2Colour = AppColor.gradiantColor2.cgColor
var renderOnese = false
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
if !renderOnese {
ApplyCustomeView()
renderOnese = true
}
}
func ApplyCustomeView() {
let GradiantLayer = ApplyGradiantView(frame: self.bounds, Colors: [gradiant1Colour,gradiant2Colour], startPoint: CGPoint(x: 0.0, y: 0.0), endPoint: CGPoint(x: 0.8, y: 1.0))
if let gradiantLayer = GradiantLayer.GradiantLayer {
self.layer.insertSublayer(gradiantLayer, at: 0)
}
}
}
和
class RedGradiantView : UIView {
var inerGradiantView = UIView()
var gradiant1Colour = AppColor.gradiantColor3.cgColor
var gradiant2Colour = AppColor.gradiantColor4.cgColor
var renderOnese = false
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
if !renderOnese {
ApplyCustomeView()
// renderOnese = true
}
}
private func ApplyCustomeView() {
inerGradiantView.frame = self.bounds.insetBy(dx: 0, dy: 0)
self.insertSubview(inerGradiantView, at: 0)
let GradiantLayer = ApplyGradiantView(frame: self.bounds, Colors: [gradiant1Colour,gradiant2Colour], startPoint: CGPoint(x: 0.0, y: 0.0), endPoint: CGPoint(x: 0.8, y: 1.0))
if let gradiantLayer = GradiantLayer.GradiantLayer {
inerGradiantView.layer.insertSublayer(gradiantLayer, at: 0)
}
inerGradiantView.layer.cornerRadius = 5
inerGradiantView.clipsToBounds = true
self.layer.cornerRadius = 5
self.clipsToBounds = true
self.backgroundColor = UIColor.white.withAlphaComponent(0.2)
}
}
和
class ShadowWithRedBluer : UIView {
var inerGradiantView = UIView()
var gradiant1Colour = AppColor.gradiantColor3.cgColor
var gradiant2Colour = AppColor.gradiantColor4.cgColor
var renderOnese = false
private var shadowLayer: CAShapeLayer!
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
if !renderOnese {
ApplyCustomeView()
// renderOnese = true
}
}
private func ApplyCustomeView() {
inerGradiantView.frame = self.bounds.insetBy(dx: 2, dy: 2)
self.insertSubview(inerGradiantView, at: 0)
let GradiantLayer = ApplyGradiantView(frame: self.bounds, Colors: [gradiant1Colour,gradiant2Colour], startPoint: CGPoint(x: 0.0, y: 0.0), endPoint: CGPoint(x: 0.8, y: 1.0))
if let gradiantLayer = GradiantLayer.GradiantLayer {
inerGradiantView.layer.insertSublayer(gradiantLayer, at: 0)
}
inerGradiantView.layer.cornerRadius = 20
inerGradiantView.clipsToBounds = true
self.layer.applySketchShadow(color: UIColor.black, alpha: 0.15, x: 0, y: 50, blur: 50, spread: 0)
self.backgroundColor = UIColor.clear
}
}
extension CALayer {
func applySketchShadow(
color: UIColor = .black,
alpha: Float = 0.5,
x: CGFloat = 0,
y: CGFloat = 2,
blur: CGFloat = 4,
spread: CGFloat = 0)
{
shadowColor = color.cgColor
shadowOpacity = alpha
shadowOffset = CGSize(width: x, height: y)
shadowRadius = blur / 2.0
if spread == 0 {
shadowPath = nil
} else {
let dx = -spread
let rect = bounds.insetBy(dx: dx, dy: dx)
shadowPath = UIBezierPath(rect: rect).cgPath
}
}
}
和
class ShadowOnlyView : UIView {
var renderOnese = false
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
if !renderOnese {
ApplyCustomeView()
// renderOnese = true
}
}
private func ApplyCustomeView() {
self.layer.applySketchShadow(color: UIColor.black, alpha: 0.15, x: 0, y: 50, blur: 50, spread: 0)
self.backgroundColor = UIColor.white.withAlphaComponent(0.5)
self.layer.cornerRadius = 10
self.clipsToBounds = true
}
}
如何使用面向协议的编程和泛型来减少重复代码?
【问题讨论】: