Music_Player3/relax.offline.mp3.music/MP/Common/Tool(工具封装)/MP_PlayerSlider.swift
2024-06-03 09:48:39 +08:00

144 lines
5.3 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Player_Slider.swift
// MusicPlayer
//
// Created by Mr.Zhou on 2024/3/29.
//
import UIKit
///Slider
class MP_PlayerSlider: UISlider {
//
var thumbImage:UIImage!
//
var trackHeight: CGFloat = 5
//
var minTrackColors: [UIColor]!
//
var maxTrackColors:[UIColor]!
//()
var minTrackLocations:[CGFloat]!
//()
var maxTrackLocations:[CGFloat]!
//
init(frame:CGRect, trackHeight: CGFloat, minTrackColors: [UIColor]!, maxTrackColors: [UIColor]!, minTrackLocations: [CGFloat]!, maxTrackLocations: [CGFloat]!) {
super.init(frame: frame)
self.trackHeight = trackHeight
self.minTrackColors = minTrackColors
self.maxTrackColors = maxTrackColors
self.minTrackLocations = minTrackLocations
self.maxTrackLocations = maxTrackLocations
setUpLayout()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
override func awakeFromNib() {
super.awakeFromNib()
trackHeight = bounds.size.height
setUpLayout()
}
private func setUpLayout() {
layer.masksToBounds = false
}
//
override func draw(_ rect: CGRect) {
//
if thumbImage != nil {
setThumbImage(thumbImage, for: .normal)
}
//
let minTrackImg = makeTrackImage(rect: rect, colors: minTrackColors, locations: minTrackLocations)
setMinimumTrackImage(minTrackImg, for: .normal)
//
let maxTrackImg = makeTrackImage(rect: rect, colors: maxTrackColors, locations: maxTrackLocations)
setMaximumTrackImage(maxTrackImg, for: .normal)
}
///
/// - Parameters:
/// - rect:
/// - color:
/// - Returns:
private func makeThumbImage(rect: CGRect, color:UIColor) -> UIImage {
let lineWidth: CGFloat = 2
//
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
//
color.setFill()
//线
let oval = UIBezierPath(ovalIn: rect)
//
oval.fill()
//
UIColor.white.setStroke()
//
oval.lineWidth = lineWidth
oval.stroke()
//
let thumbImg = UIGraphicsGetImageFromCurrentImageContext()!
//
UIGraphicsEndImageContext()
return thumbImg
}
///
/// - Parameters:
/// - rect:
/// - colors:
/// - locations:
/// - Returns:
private func makeTrackImage(rect: CGRect, colors:[UIColor], locations:[CGFloat]) -> UIImage {
let rect = CGRect(x: rect.minX, y: rect.minY, width: rect.width, height: self.trackHeight)
//
UIGraphicsBeginImageContextWithOptions(rect.size, false, 0)
let ctx = UIGraphicsGetCurrentContext()!
//
let cornerRadius: CGFloat = rect.height * 0.5
let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius).cgPath
//
ctx.addPath(path)
ctx.clip()
// 使rgb
let colorSpace = CGColorSpaceCreateDeviceRGB()
//cgcolors
var cgColors:[CGColor] = []
colors.forEach { item in
cgColors.append(item.cgColor)
}
//
let gradient:CGGradient = CGGradient(colorsSpace: colorSpace, colors: cgColors as CFArray, locations: locations)!
//
let start = CGPoint(x: self.bounds.minX, y: self.bounds.minY)
//
let end = CGPoint(x: self.bounds.maxX, y: self.bounds.minY)
//
ctx.drawLinearGradient(gradient, start: start, end: end, options: .drawsBeforeStartLocation)
//
let trackImg = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return trackImg
}
// thumb
override func thumbRect(forBounds bounds: CGRect, trackRect rect: CGRect, value: Float) -> CGRect {
let rect = super.thumbRect(forBounds: bounds, trackRect: rect, value: value)
// thumb
// (setValue(_:animated:)animatedtruethumb)
self.layer.shadowColor = UIColor.black.cgColor
self.layer.shadowOffset = CGSize(width: 0, height: 0)
self.layer.shadowOpacity = 0.15
self.layer.shadowRadius = 3
self.layer.shadowPath = UIBezierPath(cgPath: CGPath(ellipseIn: rect.insetBy(dx: 3, dy: 3), transform: nil)).cgPath
return rect
}
// track
override func trackRect(forBounds bounds: CGRect) -> CGRect {
return CGRect(x: 0, y: 0, width: bounds.width, height: self.trackHeight)
}
}