Как использовать свойство в нескольких контроллерах представления, определенных в одном файле? - PullRequest
1 голос
/ 16 января 2020

Я сделал функцию для создания круговой анимации. Функция принимает радиус: 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)
    }

}

, но в этом коде распознаватель гостя не работает.

Ответы [ 4 ]

1 голос
/ 16 января 2020

Вы можете просто создать 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 голос
/ 16 января 2020

Создайте новый файл swift с именем 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()

Вы также можете взглянуть на Быстрая документация по наследованию

0 голосов
/ 16 января 2020

Я предполагаю, что вы пытаетесь вызвать функцию один раз, чтобы использовать контроллеры всего представления. Для этого вы можете создать класс Manager. с Manager.Instance.callFunction вы можете использовать анимацию внутри каждого класса контроллера.

class Manager {
    private static let _instance =  Manager()



     static var  Instance: Manager{

        return _instance
    }

    private init(){

    }
  func callFunction(){

 // add animation stuff.

    }
0 голосов
/ 16 января 2020

Вот пример того, как вы можете это сделать. Надеюсь, это поможет

    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)
    }

}
...