2016-10-15 8 views
0

Ich versuche mich an der Erstellung einer benutzerdefinierten Aktivität Indikator Ansicht programmatisch. Das Problem ist, dass es nie anfängt zu animieren. Hier ist der Code für die spinner.swift Klasse:Probleme bei der Erstellung einer benutzerdefinierten UIActivityIndicatorView

import UIKit 

class spinner: UIActivityIndicatorView { 

var flag = Bool() 

override init(frame: CGRect) { 

    super.init(frame: frame) 
    self.flag = true 
    self.isHidden = false 

} 

required init(coder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

override func startAnimating() { 

    self.animate() 

} 

func animate() 
{ 

    if flag == true 
    { 

     UIView.animate(withDuration: 0.3, animations: { 

      self.layer.setAffineTransform(CGAffineTransform(scaleX: 0.5, y: 1)) 

     }) { (success) in 

      if success == true 
      { 

       UIView.animate(withDuration: 0.3, animations: { 

        self.layer.setAffineTransform(CGAffineTransform.identity) 

        }, completion: { (success) in 

         if success == true 
         { 

          self.animate() 

         } 

       }) 

      } 

     } 


     } 

    } 

override func stopAnimating() { 
    self.flag = false 

} 

override func draw(_ rect: CGRect) { 

    let path = UIBezierPath(ovalIn: rect) 
    UIColor.cyan.setStroke() 
    path.stroke() 
    UIColor.red.setFill() 
    path.fill() 

    } 

} 

Dies ist der Code in viewDidLoad(), wo ich die Spinner hinzugefügt haben:

let aiv = spinner(frame: CGRect(x: self.view.bounds.width/2-35, y: self.view.bounds.height/2-35, width: 70, height: 70)) 
    aiv.hidesWhenStopped = true 
    self.view.addSubview(aiv) 
    aiv.startAnimating() 
    print(aiv.isAnimating) 
    print(air) 

Ich habe kein Spinner sehen überhaupt und die folgende Meldung in der Konsole:

false 
    <spinner.spinner: 0x7f82b3e08240; baseClass = UIActivityIndicatorView; frame = (170 298.5; 35 70); transform = [0.5, 0, 0, 1, 0, 0]; hidden = YES; animations = { transform=<CABasicAnimation: 0x6080000364a0>; }; layer = <CALayer: 0x608000035120>> 

nach den Protokollen ist der Spinner versteckt, was bedeutet, es nie gestartet animieren.

Es wäre toll, wenn jemand darauf hinweisen könnte, wo ich falsch liege, und eine mögliche Lösung vorschlagen. Danke!

Antwort

1

Ihr Problem scheint wegen des Aufrufs:
aiv.hidesWhenStopped = true
und die Eigenschaft isAnimating gibt false zurück, weil Sie die belebte Methode überschreiben und nicht die Grundlage eines verwenden.
Sie sollten diese Eigenschaft in Ihrer benutzerdefinierten Klasse festlegen, wenn Sie die benutzerdefinierte Animation starten und stoppen.
Der gleiche Fall ist die hidesWhenStopped. Dies sollte von Ihnen in Ihrer Klasse implementiert werden.
Ich würde auch empfehlen, UIView als eine Unterklasse mit einem UIActivityIndicator innerhalb zu verwenden, da, wenn Sie den ActivityIndicator starten möchten, die AffineTransformation sich gegenseitig stören könnte.

+0

Die hidesWhenStopped konnte mit didSet Ihrer Flag-Eigenschaft bearbeitet werden – weissja19

Verwandte Themen