如何在单个文件中定义的多个视图控制器中使用属性?

问题描述 投票:1回答:4

我制作了制作圆形动画的功能。函数以radius:float作为输入。我已经在ViewController类中做到了这一点,并且对于该视图控制器来说工作正常。但是现在我想在多个视图控制器上使用此动画,并且不想在每个视图控制器上编写相同的代码。所以我想知道如何在单独的文件中制作此函数,使我只需要调用半径函数即可完成工作。或者您可以告诉我这样做的最佳做法。预先感谢。

//

我不想在myViewController中做到这一点,我只想为圆形动画创建一个新类。而且也不想导入该类想要这样做的-

import UIKit
class CircularProgressView {
    private let shapeLayer = CAShapeLayer()
    public func createProgressView(radius:CGFloat,forView:UIView) {
        let center = forView.center
        let circularPath = UIBezierPath(arcCenter: center, radius: radius, startAngle: -CGFloat.pi/2, endAngle: 2*CGFloat.pi, clockwise: true)

        let trackLayer = CAShapeLayer()
        trackLayer.path = circularPath.cgPath
        trackLayer.strokeColor = UIColor.lightGray.cgColor
        trackLayer.fillColor = UIColor.clear.cgColor
        trackLayer.lineWidth = 10
        forView.layer.addSublayer(trackLayer)

        shapeLayer.path = circularPath.cgPath
        shapeLayer.strokeColor = UIColor.red.cgColor
        shapeLayer.fillColor = UIColor.clear.cgColor
        shapeLayer.lineWidth = 10
        shapeLayer.lineCap = .round
        shapeLayer.strokeEnd = 0
        forView.layer.addSublayer(shapeLayer)
        forView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTap)))
    }
    @objc private func handleTap() {
        print("hello s")
        let basicAnimation = CABasicAnimation(keyPath: "strokeEnd")
        basicAnimation.toValue = 1
        basicAnimation.duration = 2

        basicAnimation.fillMode = .forwards
        basicAnimation.isRemovedOnCompletion = false

        shapeLayer.add(basicAnimation, forKey: "basic")
    }
}

并像这样使用-导入UIKit

class ViewController1: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        CircularProgressView().createProgressView(radius: 50, forView: view)
    }

}

但是在此代码中,guesture识别器不起作用。

ios swift storyboard uikit
4个回答
1
投票

您可以简单地创建UIViewController extension并在其中添加带有相关代码的方法animate(with:)

extension UIViewController {
    func animate(with radius: Float) {
        //add your code here..
    }
}

animate(with:)方法现在可用于所有UIViewController子类。因此,您可以简单地这样称呼它

class VC: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.animate(with: 10.0)
    }
}

在这种情况下,无需创建任何父级class


1
投票

创建一个新的名为BaseViewController的快速文件

import UIKit
class BaseViewController : UIViewController {
    //Add your animation code
}

并从这个新文件继承

import UIKit 
class YourVC : BaseViewController {
  // do your stuff here
}

另一种方法是通过创建扩展名。

extension UIViewController {
   func doAnimation() {
      // do your stuff here
   }
}

并使用它。

view.doAnimation()

您也可以查看继承的Swift Documention


0
投票

这里是一些示例。希望对您有所帮助

    class MyViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func startCircularAnimation(radius: Float) {
        // your animation code here
    }

}

class FirstViewController: MyViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        startCircularAnimation(radius: 25)
    }

}

class SecondViewController: MyViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        startCircularAnimation(radius: 30)
    }

}

0
投票

我假设您尝试一次调用函数以使用整个视图控制器。为了实现这一点,您可以创建Manager类。通过Manager.Instance.callFunction,您可以在每个控制器类中使用动画。

class Manager {
    private static let _instance =  Manager()



     static var  Instance: Manager{

        return _instance
    }

    private init(){

    }
  func callFunction(){

 // add animation stuff.

    }
© www.soinside.com 2019 - 2024. All rights reserved.