2017-12-27 13 views
1

hinzufügen Ich habe eine einzige Ansicht Anwendung in Xcode und die folgenden in ViewController.swift tun. Mein Ziel ist es, den Bildschirm allmählich über 5 Sekunden mit einem braunen Rechteck zu füllen. Fehle ich etwas oder ist der Ansatz völlig falsch?Allmählich Rechteck Animation in iOS

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    let expandAnimation: CABasicAnimation = CABasicAnimation(keyPath: "path") 
    expandAnimation.fromValue = UIBezierPath(rect: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.0)) 
    expandAnimation.toValue = UIBezierPath(rect: CGRect(x: 0.0, y: 0.0, width: self.view.bounds.size.width, height: self.view.bounds.size.height)) 
    expandAnimation.duration = 5.0 
    expandAnimation.fillMode = kCAFillModeForwards 
    expandAnimation.isRemovedOnCompletion = false 
    let rectLayer: CAShapeLayer = CAShapeLayer() 
    rectLayer.fillColor = UIColor.brown.cgColor 
    rectLayer.path = UIBezierPath(rect: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.0)).cgPath 
    rectLayer.add(expandAnimation, forKey: nil) 
    self.view.layer.addSublayer(rectLayer) 
} 

Ich möchte nicht die Farbe allmählich erscheinen. Ich möchte eine glasfüllende Wirkung haben. Stellen Sie sich dieses

Water Filling Fancy

mit Ausnahme der Phantasie wellige Effekte.

+0

Sie möchten, dass Ihre Ansicht allmählich ändert seine Farbe von einer Farbe zu einer anderen Farbe? –

+0

Von leer bis komplett gefüllt mit brauner Farbe –

Antwort

1

Nach Ihrer Frage besser zu verstehen, wollen Sie die Einreichung einer Wasserglas simulieren (ohne die Animation der Welle), können Sie das erreichen durch:

let myLayer: CALayer = .init() 
    myLayer.backgroundColor = UIColor.red.cgColor 
    self.view.layer.addSublayer(myLayer) 

    func animateFilling(to view:UIView) 
    { 
     var mFrame = CGRect(x: 0, y: view.frame.size.height, width: view.frame.size.width, height: 0) 
     myLayer.frame = mFrame 
     let fillingAnim = CABasicAnimation(keyPath: "bounds") 
     fillingAnim.fillMode = kCAFillModeForwards 
     fillingAnim.fromValue = mFrame 
     fillingAnim.duration = 2 
     fillingAnim.isRemovedOnCompletion = false 
     mFrame.size.height = 1000 
     fillingAnim.toValue = mFrame 
     myLayer.add(fillingAnim, forKey: nil) 
    } 
+0

Entschuldigung Wenn ich in meiner Erklärung nicht ausführlich genug war. Aber ich möchte nicht, dass die Farbe allmählich erscheint. Ich möchte ein Gegenteil von einer Glasfüllung Art von Wirkung. Stellen Sie sich das Gegenteil von [this] vor (http://i1.wp.com/www.quartzcodeapp.com/wp-content/uploads/2015/03/water-fill-animation.gif?resize=300%2C300) außer für die ausgefallenen Welleneffekte. Deshalb benutzte ich 'UIBezierPath' –

+0

Danke für die schnelle Antwort! –

+0

Cool, aktualisieren Sie Ihre Frage mit diesem gif, wird für die Menschen klarer. –

1

Ich denke, es einfach ist, es zu tun, wie dass, wenn Sie nicht möchten, Top-Welle

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 

    let vv = UIView(frame: CGRect(x: 0, y: self.view.bounds.size.height, width: self.view.bounds.size.width, height: 0)) 

    vv.backgroundColor = UIColor.brown 

    self.view.addSubview(vv) 

    UIView.animate(withDuration: 5.0) { 


     vv.frame = CGRect(x: 0, y: self.view.bounds.size.height/3.0, width: self.view.bounds.size.width, height: self.view.bounds.size.height * 2/3.0) 

    } 

} 
+1

Danke, es macht den Job auch! –