2017-05-26 57 views
0

我从字面上看在网上像2to3的时间,可惜找不到任何东西,(第二个问题:被新SWIFT - >这是可以忽略不计)swift中的动画:圆形虚线载入栏?

基本上我需要循环虚线加载条:每个点应该独立动画像一个圆形的负荷..

我能够做出一个圆虚线圆圈,但不能设置动画...

任何帮助,将不胜感激,即使这就是一个来自github或anythin的图书馆g^..

这是我创建一个圆形虚线圆圈代码..

import UIKit 

class ViewController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: 100,y: 100), radius: 100.0, startAngle: 0.0, endAngle:CGFloat(M_PI * 2), clockwise: true) 
    let shapeLayer = CAShapeLayer() 
    shapeLayer.path = circlePath.cgPath 
    shapeLayer.position = CGPoint(x: 100, y: 100) 
    shapeLayer.fillColor = UIColor.clear.cgColor 
    shapeLayer.strokeColor = UIColor.blue.cgColor 
    shapeLayer.lineWidth = 6.0 
    let one : NSNumber = 1 
    let two : NSNumber = 13 
    shapeLayer.lineDashPattern = [one,two] 
    shapeLayer.lineCap = kCALineCapRound 
    view.layer.addSublayer(shapeLayer) 

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

thats what I got

这就是我想要的(下面的一个):

enter image description here

回答

1

我一直在与自定义活动指标玩耍,所以这里的做

import UIKit 

@IBDesignable class ActivityIndicatorCircle: UIView { 
    var timerInterval: Double = 0.1 
    var timer : Timer? 
    var endAngle: CGFloat = 0.0 
    var angleStep   = CGFloat.pi/20.0 
    var angleOffset   = -CGFloat.pi/2.0 

    var shapeLayer = CAShapeLayer() 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
    } 

    func startAnimating() { 
     superview?.bringSubview(toFront: self) 

     layer.cornerRadius = frame.width/2 
     self.clipsToBounds = true 

     isHidden = false 
     timer?.invalidate() 
     timer = nil 

     timer = Timer.scheduledTimer(timeInterval: timerInterval, 
           target: self, 
           selector: #selector(self.updateCircle), 
           userInfo: nil, 
           repeats: true) 
    } 

    func stopAnimating() { 
     isHidden = true 
     timer?.invalidate() 
     timer = nil 
    } 

    func updateCircle() { 
     endAngle += angleStep 
     if endAngle > CGFloat.pi * 2.0 { 
      endAngle -= CGFloat.pi * 2.0 
     } 
     DispatchQueue.main.async { 
      self.shapeLayer.removeFromSuperlayer() // remove the previous version 

      let lineWidth: CGFloat = 6.0 
      let radius = self.frame.size.width/2.0 // if the view is square, this gives us center as well 

      let circlePath = UIBezierPath(arcCenter: CGPoint(x: radius,y: radius), radius: radius - lineWidth, startAngle: self.angleOffset, endAngle: self.endAngle + self.angleOffset, clockwise: true) 

      self.shapeLayer.path = circlePath.cgPath 
      self.shapeLayer.position = CGPoint(x: 0, y: 0) 
      self.shapeLayer.fillColor = UIColor.clear.cgColor 
      self.shapeLayer.strokeColor = UIColor.blue.cgColor 
      self.shapeLayer.lineWidth = lineWidth 
      let one : NSNumber = 1 
      let two : NSNumber = 13 
      self.shapeLayer.lineDashPattern = [one,two] 
      self.shapeLayer.lineCap = kCALineCapRound 
      self.layer.addSublayer(self.shapeLayer) 
     } 
    } 
} 

使用一个方法,一个UIView添加到您的故事板,并设置类ActivityIndicatorCircle

要启动它,请拨打activityIndicatorCircle.startAnimating()

+0

嘿罗素谢谢你的答案曼。 你可以提供更多的信息.​​. 我的意思是它不工作,无论你说我做到了。 我在viewcontroller.swift的viewDidAppear中为ActivityIndi​​catorCircle创建了一个对象,在storyBoard中已经为该视图分配了该类。还没有开始。 –

+1

我为你创建了一个示例项目https://github.com/CarterMiller/ActivityIndi​​catorCircle。因为我在一个我已经完成的循环指标的基础上,可以看到我是如何在同一个项目中完成的:-) – Russell

+0

哇! Thanku Mr.russell .. 它解决了这个问题..非常感谢。 只是因为你的人社区像stackoverflow等存在.. 保持良好的工作= D =) –