2016-04-06 8 views
0

Haben Sie hier eine Beispielanwendung geschrieben, um etwas Animationsverhalten zu illustrieren, das nicht ganz richtig zu sein scheint? Ich erstelle eine Stapelansicht in der unteren Hälfte des Bildschirms, füge eine Schaltfläche hinzu, animiere sie, verschiebe sie auf den Bildschirm {bewegt sich} einschließlich der Schaltfläche, aber die Aktion, die der Schaltfläche angehängt ist, bleibt in der unteren Hälfte?Stack View Bug oder habe ich etwas übersehen?

Tatsächlich, wenn ich den Debugger auf Xcode ansehe, hat es sich überhaupt nicht bewegt.

Es gibt einige Action, die ich hier verpasst habe? Ja?

import UIKit 

class ViewController: UIViewController { 

var selectSV: UIStackView! 
var goNorth:CABasicAnimation! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    selectSV = UIStackView(frame: CGRect(x: 256, y: 696, width: 256, height: 196)) 
    selectSV!.axis = .Vertical 
    selectSV!.spacing = 4.0 
    selectSV!.alignment = .Center 
    selectSV!.distribution = .FillEqually 

    let zeroRect = CGRect(x: 0,y: 0,width: 0,height: 0) 
    let newB = UIButton(frame: zeroRect) 
    newB.setTitle("Blah", forState: UIControlState.Normal) 
    newB.titleLabel!.font = UIFont(name: "Palatino", size: 24) 
    newB.frame = CGRect(x: 0, y: 0, width: 128, height: 32) 
    newB.addTarget(self, action: #selector(ViewController.blahblah(_:)), forControlEvents: .TouchUpInside) 
    newB.backgroundColor = UIColor.blueColor() 

    self.selectSV.addArrangedSubview(newB) 
    self.view.addSubview(selectSV) 
    NSTimer.scheduledTimerWithTimeInterval(4.0, target: self, selector: #selector(ViewController.moveSV), userInfo: nil, repeats: false) 
    // Do any additional setup after loading the view, typically from a nib. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func blahblah(sender: AnyObject) { 
    print("You hit me!") 
} 

func moveSV() { 
    self.animateNorth() 
    self.selectSV.layer.addAnimation(self.goNorth, forKey: nil) 
} 

func animateNorth() { 
    goNorth = CABasicAnimation(keyPath: "position.y") 
    goNorth.fromValue = 792 
    goNorth.toValue = 288 
    goNorth.duration = 4.0 
    goNorth.delegate = self 
    goNorth.setValue("window", forKey:"goNorth") 
    goNorth.removedOnCompletion = false 
    goNorth.fillMode = kCAFillModeForwards 
} 
} 

Antwort

1

Sie animieren die Sicherungsschicht Ihrer Stackview und nicht den Rahmen der Stackview selbst. Um die Stapelansicht zu animieren, können Sie die UIView Methode animateWithDuration:animations: verwenden und die frame Eigenschaft des Stackview animieren. Um besser zu sehen, was jetzt passiert, können Sie selectSV.clipsToBounds = true zu Ihrem Stackview aktivieren. Auf diese Weise wird die layer der Stapelansicht abgeschnitten, wenn sie den Rahmen verlässt.

0

Danke Gelee!

kommentiert aus dieser ...

self.animateNorth() 
self.selectSV.layer.addAnimation(self.goNorth, forKey: nil) 

und ersetzte es durch das perfekt funktioniert !!

UIView.animateWithDuration(0.5, animations: { 
          self.selectSV.center.y = 288.0 
         }) 

einfach, wenn Sie wissen, wie ... viel in diesem Bereich zu lernen ...

Verwandte Themen