0
在我的場景中,我有2個視圖:第一個保存CALayer實例(條),另一個保存CAGradientLayer並放置第一個。下圖描述了當前狀態。在CALayers上掩蔽CAGradientLayer
但我需要這個梯度僅被施加到第一視圖的杆(CALayer的)。
我還沒有發現任何相關信息到我的問題。任何幫助讚賞。
在我的場景中,我有2個視圖:第一個保存CALayer實例(條),另一個保存CAGradientLayer並放置第一個。下圖描述了當前狀態。在CALayers上掩蔽CAGradientLayer
但我需要這個梯度僅被施加到第一視圖的杆(CALayer的)。
我還沒有發現任何相關信息到我的問題。任何幫助讚賞。
您必須將掩膜應用於漸變。有多種方法可以解決這個問題。
您可以創建一個CAShapeLayer
,將形狀圖層的path
設置爲條形的形狀,並將漸變圖層的mask
設置爲該形狀圖層。
或者您可以擺脫酒吧層,而是使用兩個漸變圖層,一個用於橙色酒吧,另一個用於灰色酒吧。將兩個漸變圖層並排放置在子視圖中,並將超級視圖的圖層蒙版設置爲形狀圖層。以下是如何做到這一點。
您需要兩個梯度層和形狀層:
@IBDesignable
class BarGraphView : UIView {
private let orangeGradientLayer = CAGradientLayer()
private let grayGradientLayer = CAGradientLayer()
private let maskLayer = CAShapeLayer()
你還需要的條寬:
private let barWidth = CGFloat(9)
在初始化的時候,建立了梯度和添加所有子層:
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
private func commonInit() {
backgroundColor = .black
initGradientLayer(orangeGradientLayer, with: .orange)
initGradientLayer(grayGradientLayer, with: .gray)
maskLayer.strokeColor = nil
maskLayer.fillColor = UIColor.white.cgColor
layer.mask = maskLayer
}
private func initGradientLayer(_ gradientLayer: CAGradientLayer, with color: UIColor) {
gradientLayer.colors = [ color, color, color.withAlphaComponent(0.6), color ].map({ $0.cgColor })
gradientLayer.locations = [ 0.0, 0.5, 0.5, 1.0 ]
layer.addSublayer(gradientLayer)
}
在佈局時間,設置梯度層的幀並設置掩模捻呃的路徑。這需要一點工作,因爲你不想要一個酒吧半橙和半灰。
override func layoutSubviews() {
super.layoutSubviews()
let barCount = ceil(bounds.size.width/barWidth)
let orangeBarCount = floor(barCount/2)
let grayBarCount = barCount - orangeBarCount
var grayFrame = bounds
grayFrame.size.width = grayBarCount * barWidth
grayFrame.origin.x = frame.maxX - grayFrame.size.width
grayGradientLayer.frame = grayFrame
var orangeFrame = bounds
orangeFrame.size.width -= grayFrame.size.width
orangeGradientLayer.frame = orangeFrame
maskLayer.frame = bounds
maskLayer.path = barPath()
}
private func barPath() -> CGPath {
var columnBounds = self.bounds
columnBounds.origin.x = columnBounds.maxX
columnBounds.size.width = barWidth
let path = CGMutablePath()
for datum in barData.reversed() {
columnBounds.origin.x -= barWidth
let barHeight = CGFloat(datum) * columnBounds.size.height
let barRect = columnBounds.insetBy(dx: 1, dy: (columnBounds.size.height - barHeight)/2)
path.addRoundedRect(in: barRect, cornerWidth: 2, cornerHeight: 2)
}
return path
}
let barData: [Double] = {
let count = 100
return (0 ..< count).map({ 0.5 + (1 + sin(8.0 * .pi * Double($0)/Double(count)))/4 })
}()
}
結果:
的BarGraphView
是透明的地方有沒有吧。如果你想讓它在黑暗背景下,把一個黑暗的觀點背後,或使其黑暗的視圖的子視圖:
非常感謝你爲這個精彩實例 – WINSergey