零落成泥碾作塵,唯有香如故!<藍蟾蜍>
忙里偷閑練習一下 Swift
效果圖:
自定義 barbutton.gif
效果分析: 其實這個效果就是就是類似一個 UISlider只是自定義了滑塊,使用的是 UIProgress 進度條, 點擊進度條的上點, 滑塊自動滑到對應(yīng)的點! 這里的滑塊可以換成其他的控件.
思路: 我的思路就是在 UIProgress 進度條上添加一個 UIView 作為滑塊, 然后進度上加點擊手勢根據(jù)點擊的位置去調(diào)整進度條的進度值, 以及改變滑塊的位置!
代碼部分:
# 這個代理協(xié)議是為了在進度條改變的時候 讓其代理執(zhí)行方法 例如音頻根據(jù)改變的進度去 相應(yīng)的調(diào)整到對應(yīng)的位置播放
protocol DDProgressViewDelegate
{
func ddProgressView(ddProgressView: DDProgressView, changeProgress currenProgress:Float)
}
class DDProgressView: UIProgressView {
// 進度條上的滑塊
let sliderView: UIView = UIView.init()
// 代理
var delegate:DDProgressViewDelegate?
# 代碼初始化方法
override init(frame: CGRect) {
super.init(frame: frame)
// 設(shè)置一下 滑塊的大小 位置 顏色 等屬性
sliderView.backgroundColor = UIColor.redColor()
sliderView.bounds = CGRectMake(0, 0, 5, 5)
// 讓小滑塊的中心點 在進度的端點位置
sliderView.center = CGPointMake( CGFloat(self.progress) * self.bounds.size.width, self.bounds.size.height / 2);
self.addSubview(sliderView)
// 給滑條加一個手勢 目的是為了點擊滑條 進度端點就變成點擊點位置
self.userInteractionEnabled = true; // 開交互
let tap: UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "tapAction:")
self.addGestureRecognizer(tap)
}
# 可視化編程 初始化
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// 設(shè)置一下 滑塊的大小 位置 顏色 等屬性
sliderView.backgroundColor = UIColor.redColor()
sliderView.bounds = CGRectMake(0, 0, 5, 5)
sliderView.center = CGPointMake( CGFloat(self.progress) * self.bounds.size.width, self.bounds.size.height / 2);
self.addSubview(sliderView)
// 給滑條加一個手勢 目的是為了點擊滑條 進度端點就變成點擊點位置
self.userInteractionEnabled = true; // 開交互
let tap: UITapGestureRecognizer = UITapGestureRecognizer.init(target: self, action: "tapAction:")
self.addGestureRecognizer(tap)
}
// 點擊進度條后執(zhí)行的 手勢事件
func tapAction(tap : UITapGestureRecognizer)
{
let touchPoint: CGPoint = tap.locationInView(self)
// 設(shè)置進度條的進度 當前點擊的點前面的長度 占整個寬度的百分比 就是當前的進度
self.setProgress(Float(touchPoint.x / self.bounds.size.width) , animated: true)
// 進度條改變了 出發(fā)代理執(zhí)行代理事件 讓用的地方可以相應(yīng)的改變 比如音頻視頻的播放進度調(diào)整
self.delegate?.ddProgressView(self, changeProgress: self.progress)
}
// 重新把 子控件的滑塊 布局到端點位置
override func layoutSubviews()
{
super.layoutSubviews()
// 讓小滑塊的中心點 在進度的端點位置
sliderView.center = CGPointMake( CGFloat(self.progress) * self.bounds.size.width, self.bounds.size.height / 2);
}
}