Music_Player3/MusicPlayer/MP/Views/Home(音乐资源列表-播放器)/Player_Slider.swift
Mr.zhou 96147c5e37 项目:Musicoo
版本:A面 1.0
构建:1.1
更新内容:对项目A面功能的实现,经测试确定各项功能无问题。
更新时间:2024年4月12日 11:20
上传状态:已上传App Connect
2024-04-12 11:19:58 +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 Player_Slider: 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)
}
}