程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了完成前一条后如何多次绘制相同的贝塞尔曲线?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决完成前一条后如何多次绘制相同的贝塞尔曲线??

开发过程中遇到完成前一条后如何多次绘制相同的贝塞尔曲线?的问题如何解决?下面主要结合日常开发的经验,给出你关于完成前一条后如何多次绘制相同的贝塞尔曲线?的解决方法建议,希望对你解决完成前一条后如何多次绘制相同的贝塞尔曲线?有所启发或帮助;

我正在使用贝塞尔曲线路径、形状图层和 CABasicAnimation 以动画方式绘制视图。但它只绘制一次视图。完成前一条后如何多次绘制相同的贝塞尔曲线?

这是用于创建此类波形的附加代码。请检查...

完成前一条后如何多次绘制相同的贝塞尔曲线?

class VIEwController: UIVIEwController {

@IBOutlet weak var scrollVIEw: UIScrollVIEw!
@IBOutlet weak var graphVIEw: UIVIEw!

// MARK:- PROPERTIES
var movingPoint: CGfloat = 0.0
var starTinterval: CGfloat = 10.0
var noOfIntervals: CGfloat = 0
var intervalWIDth: CGfloat = 0
var pWaveWIDth: CGfloat = 20.0
var qrsWaveWIDth: CGfloat = 15
var tWaveWIDth: CGfloat = 30
var gapbetweenTwoIntervals: CGfloat = 50
let shapeLayer = CAShapeLayer()
var bezIErPath = UIBezIErPath()
let animation = CABasicAnimation(keyPath: "strokeEnd")



overrIDe func vIEwDIDLoad() {
    super.vIEwDIDLoad()
    
    graphVIEw.translatesautoresizingMaskIntoConsTraints = true
    graphVIEw.frame.size = CGSize(wIDth: 100000,height: 150)
    dispatchQueue.main.async {
        self.graphVIEw.layoutIfNeeded()
    }
}

overrIDe func vIEwDIDAppear(_ animated: Bool) {
    super.vIEwDIDAppear(animated)
    createGraph()
}


@objc func createGraph() {
    shapeLayer.fillcolor = UIcolor.clear.cgcolor
    shapeLayer.strokecolor = UIcolor.red.cgcolor
    shapeLayer.linewidth = 2.0
    _ = createBezIErPath()
    graphVIEw.layer.addSublayer(shapeLayer)
}

@discardableResult
@objc func createBezIErPath(isPathAlreadyCreated: Bool = falsE) -> UIBezIErPath {
    
    for _ in 0..<205 {
        let path = UIBezIErPath()
        path.move(to: CGPoint(x: movingPoint,y: graphVIEw.halfheight))
        path.addline(to: CGPoint(x: starTinterval,y: graphVIEw.halfheight))
        
        // P Point Curve
        let pWaveX = starTinterval + pWaveWIDth
        path.addQuadCurve(to: CGPoint(x: pWaveX,y: graphVIEw.halfheight),controlPoint: CGPoint(x: pWaveX - 6.0,y: graphVIEw.halfheight - 30.0))
        
        let gapbetweenPAndQRS: CGfloat = 20.0
        path.addline(to: CGPoint(x: (pWaveX + gapbetweenPAndQRS),y: graphVIEw.halfheight))
        
        // QRS
        let qRSStartPoint = pWaveX + gapbetweenPAndQRS
        let qrsComplex = qRSStartPoint + qrsWaveWIDth
        let qrsComplexEndPoint = qrsComplex + (qrsWaveWIDth / 2)
        path.addline(to: CGPoint(x: qRSStartPoint + (qrsWaveWIDth / 2),y: graphVIEw.halfheight - 70.0))
        path.addline(to: CGPoint(x: qrsComplex,y: graphVIEw.halfheight + 40.0))
        path.addline(to: CGPoint(x: qrsComplexEndPoint,y: graphVIEw.halfheight))
        
        let gapbetweenQRSAndTWave: CGfloat = 20.0
        let tWaveStartPoint = qrsComplexEndPoint + gapbetweenQRSAndTWave
        path.addline(to: CGPoint(x: tWaveStartPoint,y: graphVIEw.halfheight))
        
        // T Point Curve
        let tWaveEndX = tWaveStartPoint + tWaveWIDth
        print(tWaveEndX)
        path.addQuadCurve(to: CGPoint(x: tWaveEndX,controlPoint: CGPoint(x: tWaveEndX - 7.0,y: graphVIEw.halfheight - 30.0))
        
        movingPoint = tWaveEndX
        starTinterval = tWaveEndX + gapbetweenTwoIntervals
        path.addline(to: CGPoint(x: starTinterval,y: graphVIEw.halfheight))
        bezIErPath.append(path)
    }
    
    shapeLayer.path = bezIErPath.cgPath
    
    animation.fromValue = 0.0
    animation.duration = 205 * 2
    shapeLayer.add(animation,forKey: "PathAnimation")
    
    return bezIErPath
}

}

解决方法

我设法解决了您的问题,请检查并告诉我它是否适合您。

注意 - 我添加了一个按钮单击以添加更多图形模式,而不是服务器响应。您可以通过调用服务器响应成功方法中的按钮点击代码来使用服务器响应来执行相同的操作。

import UIKit

class GraphViewController: UIViewController {

@IBOutlet weak var graphView: UIView!

// MARK:- PROPERTIES
var movingPoint: CGFloat = 0.0
var starTinterval: CGFloat = 10.0
var noOfIntervals: CGFloat = 0
var intervalWidth: CGFloat = 0
var pWaveWidth: CGFloat = 20.0
var qrsWaveWidth: CGFloat = 15
var tWaveWidth: CGFloat = 30
var gapbetweenTwoIntervals: CGFloat = 50
let animation = CABasicAnimation(keyPath: "strokeEnd")

override func viewDidLoad() {
    super.viewDidLoad()
    
    graphView.translatesAutoresizingMaskIntoConsTraints = true
    graphView.BACkgroundColor = .blue
    graphView.frame.size = CGSize(width: 100000,height: 250)
    DispatchQueue.main.async {
        self.graphView.layoutIfNeeded()
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    createBezierPath(repeatLoop: 1)
}

@objc func createBezierPath(repeatLoop: int) {
    let pathsArray = UIBezierPath()
    
    let shapeLayer = CAShapeLayer()
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.strokeColor = UIColor.red.cgColor
    shapeLayer.lineWidth = 2.0
    
    for _ in 0..<repeatLoop {
        let path = UIBezierPath()
        path.move(to: CGPoint(x: movingPoint,y: graphView.halfHeight))
        path.addLine(to: CGPoint(x: starTinterval,y: graphView.halfHeight))
        
        // P Point Curve
        let pWaveX = starTinterval + pWaveWidth
        path.addQuadCurve(to: CGPoint(x: pWaveX,y: graphView.halfHeight),controlPoint: CGPoint(x: pWaveX - 6.0,y: graphView.halfHeight - 30.0))
        
        let gapbetweenPAndQRS: CGFloat = 20.0
        path.addLine(to: CGPoint(x: (pWaveX + gapbetweenPAndQRS),y: graphView.halfHeight))
        
        // QRS
        let qrsStartPoint = pWaveX + gapbetweenPAndQRS
        let qrsComplex = qrsStartPoint + qrsWaveWidth
        let qrsComplexEndPoint = qrsComplex + (qrsWaveWidth / 2)
        path.addLine(to: CGPoint(x: qrsStartPoint + (qrsWaveWidth / 2),y: graphView.halfHeight - 70.0))
        path.addLine(to: CGPoint(x: qrsComplex,y: graphView.halfHeight + 40.0))
        path.addLine(to: CGPoint(x: qrsComplexEndPoint,y: graphView.halfHeight))
        
        let gapbetweenQRSAndTWave: CGFloat = 20.0
        let tWaveStartPoint = qrsComplexEndPoint + gapbetweenQRSAndTWave
        path.addLine(to: CGPoint(x: tWaveStartPoint,y: graphView.halfHeight))
        
        // T Point Curve
        let tWaveEndX = tWaveStartPoint + tWaveWidth
        print(tWaveEndX)
        path.addQuadCurve(to: CGPoint(x: tWaveEndX,controlPoint: CGPoint(x: tWaveEndX - 7.0,y: graphView.halfHeight - 30.0))
        
        movingPoint = tWaveEndX
        starTinterval = tWaveEndX + gapbetweenTwoIntervals
        path.addLine(to: CGPoint(x: starTinterval,y: graphView.halfHeight))
        pathsArray.append(path)
        
        shapeLayer.path = pathsArray.cgPath
        
        animation.fromValue = 0.0
        animation.duration = Double(repeatLoop) * 2
        shapeLayer.add(animation,forKey: "PathAnimation")
    }
    
    graphView.layer.addSublayer(shapeLayer)
}

@IBACtion func btnTap(_ sender: Any) {
    createBezierPath(repeatLoop: 2)
}
}

extension UIView {
var halfHeight: CGFloat {
    return self.frame.size.height / 2.0
}
}

乐于助人:)

大佬总结

以上是大佬教程为你收集整理的完成前一条后如何多次绘制相同的贝塞尔曲线?全部内容,希望文章能够帮你解决完成前一条后如何多次绘制相同的贝塞尔曲线?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: