2017-01-27 3 views
0

Ich bin auf der Suche nach dem besten Weg, um die Stelle von zwei UIView umzukehren, mit Animation wenn möglich (zuerst muss ich den Ort ändern, Animation ist optional).Invert Ort der UIView, mit Animation

Viewcontroller:

image view

Also, ich view1 will seinen Platz mit dem view2 invertieren. Die views sind mit automatischem Layout im Storyboard beim init festgelegt.

if state == true { 
    view1 at the top 
    view2 at the bot 
} else { 
    view 2 at the top 
    view 1 at the top 
} 

habe ich versucht, view.frame.(x, y, width, height) aus der anderen Sicht zu nehmen und es zu der Ansicht festgelegt, aber es funktioniert nicht.

+1

sind die Ansichtsgrößen immer gleich oder sie sind dynamisch? – John

+2

@John Frage ist wichtig, wenn die Ansicht die gleiche Größe haben, könnten Sie vielleicht Tabellenansicht anstelle von verschiedenen Ansichten verwenden. und animiere dann die Zeilen. –

+0

@John Sie sind dynamisch, Höhe ist proportional zu SuperView. View1 ist die oberste Einschränkung für die Kopfzeile und die obere Einschränkung von View2 für View1. Ich denke, ich muss es ändern? – Makaille

Antwort

3

Ich denke, der beste Weg, dies zu tun wäre, eine topConstraint haben für beide Ansichten auf den Kopf verbunden und dann ihre Werte ändern und animiere den Übergang. Sie können es in ähnlicher Weise wie dies tun:

class MyViewController: UIViewController { 

var view1TopConstraint: NSLayoutConstraint! 
var view2TopConstraint: NSLayoutConstraint! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    view1TopConstraint = view1.topAnchor.constraintEqualToAnchor(header.bottomAnchor, constant: 0) 
    view1TopConstraint.isActive = true 

    view2TopConstraint = view2.topAnchor.constraintEqualToAnchor(header.bottomAnchor, constant: view1.frame.height) 
    view2TopConstraint.isActive = true 
} 

func changeView2ToTop() { 
    UIView.animateWithDuration(0.2, animations: { //this will animate the change between 2 and 1 where 2 is at the top now 
    self.view2TopConstraint.constant = 0 
    self.view1TopConstraint.constant = view2.frame.height 
    //or knowing that view2.frame.height represents 30% of the total view frame you can do like this as well 
    //  self.view1TopConstraint.constant = view.frame.height * 0.3 

    self.view.layoutIfNeeded() 
    }) 
} 

Sie könnten auch die NSLayoutConstraint in Storyboard erstellen und einen Auslass haben anstelle der Variablen I erstellt haben oder die obere Beschränkung für beide Ansichten in Storyboard auf „entfernen zur Bauzeit "wenn du beides machst. Auf diese Weise haben Sie keine 2 Einschränkungen und keine Einschränkung Warrning

+0

Das macht meine Ansicht 2 richtig auf den Header gesetzt, aber view1 verschwinden – Makaille

+0

stellen Sie sicher, dass die View2.frame.Height gesetzt ist, wenn Sie die Funktion ausführen. Wenn Sie das Verhältnis bereits kennen, sollten Sie versuchen, es durch die Proportion zu ersetzen. Ich werde die Antwort bearbeiten, wie Sie es mit Proportion ersetzen können – John

+0

Ich denke, das ist ein Konflikt in der Einschränkung, denn ich habe im Debugger: UIViewAlertForUnsatisfibableConstraints Warnung – Makaille

0

Ich machte ein Beispiel: https://dl.dropboxusercontent.com/u/24078452/MovingView.zip

ich gerade ein Storyboard mit 3 Ansicht, Kopfzeile, View 1 (rot) und View 2 (Gelb). Dann habe ich IBOutlets und animiert sie bei viewDid Auftritt, hier ist der Code:

import UIKit 

class ViewController: UIViewController { 

    var position1: CGRect? 
    var position2: CGRect? 

    @IBOutlet weak var view1: UIView! 
    @IBOutlet weak var view2: UIView! 
    override func viewDidLoad() { 
     super.viewDidLoad() 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     position1 = view1.frame 
     position2 = view2.frame 
     UIView.animate(withDuration: 2.5) { 
      self.view1.frame = self.position2! 
      self.view2.frame = self.position1! 
     } 
    } 


} 
-1

Hallo @Makaille Ich habe versucht, Ihr Problem zu lösen. Ich habe ein Beispiel gemacht, das Ihnen für Ihre erforderliche Implementierung helfen wird. Hier finden Sie: Source Code

Ich hoffe, es wird Ihnen helfen.

@IBAction func toggle(_ sender: UIButton) { 

    sender.isUserInteractionEnabled = false 

    if(sender.isSelected){ 
     let topPinConstantValue = layout_view2TopPin.constant 
     layout_view1TopPin.constant = topPinConstantValue 
     layout_view2TopPin.priority = 249 
     layout_view1BottomPin_to_View2Top.priority = 999 

     layout_view1TopPin.priority = 999 
     layout_view2BottomPin_ToView1Top.priority = 249 

     UIView.animate(withDuration: 0.3, animations: { 
      self.view.layoutIfNeeded() 
     }, completion: { (value) in 
      if(value){ 
       sender.isUserInteractionEnabled = true 
      } 
     }) 

    } else { 
     let topPinConstantValue = layout_view1TopPin.constant 
     layout_view2TopPin.constant = topPinConstantValue 
     layout_view1TopPin.priority = 249 
     layout_view2BottomPin_ToView1Top.priority = 999 

     layout_view2TopPin.priority = 999 
     layout_view1BottomPin_to_View2Top.priority = 249 

     UIView.animate(withDuration: 0.3, animations: { 
      self.view.layoutIfNeeded() 
      }, completion: { (value) in 
       if(value){ 
        sender.isUserInteractionEnabled = true 
       } 
     }) 
    } 

    sender.isSelected = !sender.isSelected 
} 
+0

Danke für deine Zeit, ich benutze keine untere Einschränkung, weil ich proportionale Höhe habe, ich werde versuchen, es anzupassen, es sieht wie toll aus. Nur eine Frage, warum Priorität auf 249? ist es nur zufällig, niedrig zu sein? – Makaille

+0

Da, wenn wir die Prioritäten zur Laufzeit ändern wollen, müssen wir 250 bis 249 und 1000 bis 999 setzen, sonst werden wir ein Problem haben. –

+0

down Wähler sollten ihre Kommentare auch setzen .... –