// // HPMeasureLineClosure // HPlusFit // // Created by lemo. on 2019/9/24. // Copyright © 2019 lemo. All rights reserved. // import UIKit fileprivate struct Metric { static let radius = kScaleWidth(3.0) } typealias HPMeasureLineClosure = (CGFloat, Bool) -> Void class MeasureLineView: UIView { var measureLineView: UIView! var shaperLayers: [CAShapeLayer] = [] var measureLineClosure: HPMeasureLineClosure? override init(frame: CGRect) { super.init(frame: frame) // 拖动手势 let pan = UIPanGestureRecognizer(target: self, action: #selector(panAction(pan:))) pan.maximumNumberOfTouches = 1 //一个手指拖动 self.addGestureRecognizer(pan) self.measureLineView = UIView() self.measureLineView.frame = CGRect(x: 0, y: kScaleHeight(0), width: 2*Metric.radius, height: self.height) self.measureLineView.center = CGPoint(x: self.center.x, y: self.measureLineView.center.y) self.measureLineView.backgroundColor = UIColor.clear self.addSubview(self.measureLineView) } func drawMeasureLine(topSpace: CGFloat) { for layer in self.shaperLayers { layer.removeFromSuperlayer() } // 绘制实线 let solidShaperLayer = CAShapeLayer() solidShaperLayer.lineWidth = kScaleWidth(2.0) solidShaperLayer.strokeColor = UIColor.hexColor(0x4E576F).withAlphaComponent(0.1).cgColor solidShaperLayer.fillColor = UIColor.clear.cgColor self.measureLineView.layer.addSublayer(solidShaperLayer) self.shaperLayers.append(solidShaperLayer) let solidPath = UIBezierPath() solidPath.move(to: CGPoint(x: Metric.radius, y: 0)) solidPath.addLine(to: CGPoint(x: Metric.radius, y: topSpace - Metric.radius)) solidShaperLayer.path = solidPath.cgPath // 绘制圆圈 let circleShaperLayer = CAShapeLayer() circleShaperLayer.lineWidth = kScaleWidth(2.0) circleShaperLayer.strokeColor = UIColor.hexColor(0x4E576F).cgColor circleShaperLayer.fillColor = UIColor.clear.cgColor self.measureLineView.layer.addSublayer(circleShaperLayer) self.shaperLayers.append(circleShaperLayer) let circlePath = UIBezierPath() circlePath.addArc(withCenter: CGPoint(x: Metric.radius, y: topSpace), radius: Metric.radius, startAngle: 0, endAngle: CGFloat(Double.pi*2.0), clockwise: true) circleShaperLayer.path = circlePath.cgPath // 绘制虚线 let dashLineShaperLayer = CAShapeLayer() dashLineShaperLayer.lineWidth = kScaleWidth(2.0) dashLineShaperLayer.strokeColor = UIColor.hexColor(0x4E576F).cgColor dashLineShaperLayer.lineDashPattern = [NSNumber(value: 4), NSNumber(value: 4)] dashLineShaperLayer.lineCap = CAShapeLayerLineCap.round dashLineShaperLayer.lineJoin = CAShapeLayerLineJoin.round self.measureLineView.layer.addSublayer(dashLineShaperLayer) self.shaperLayers.append(dashLineShaperLayer) let dashPath = UIBezierPath() dashPath.move(to: CGPoint(x: Metric.radius, y: topSpace + Metric.radius)) dashPath.addLine(to: CGPoint(x: Metric.radius, y: self.height)) dashLineShaperLayer.path = dashPath.cgPath } required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") } //拖动手势 @objc func panAction(pan: UIPanGestureRecognizer) { let point = pan.location(in: self) print("point x: \(point.x)") var xValue: CGFloat = 0.0 if point.x <= 0 { self.measureLineView.center = CGPoint(x: 0, y: self.measureLineView.center.y) }else if point.x >= self.width { self.measureLineView.center = CGPoint(x: self.width, y: self.measureLineView.center.y) xValue = self.width }else { self.measureLineView.center = CGPoint(x: point.x, y: self.measureLineView.center.y) xValue = point.x } print("state: \(pan.state.rawValue)") if pan.state.rawValue == 3 { xValue = 0 self.measureLineView.isHidden = true }else { self.measureLineView.isHidden = false } if let measureColsure = self.measureLineClosure { measureColsure(xValue, self.measureLineView.isHidden) } } }