2017-01-27 66 views
0

我正在尋找反轉兩種UIView地點的最佳方式,動畫(如果可能首先我需要改變的地方,動畫optionnal)。反轉地方的UIView,動畫

的viewController

image view

所以,我想view1view2顛倒了自己的位置。 views在init的故事板中設置爲自動佈局。

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

我試圖採取view.frame.(x, y, width, height)從另一種觀點,並將其設置到視圖,但它不工作。

+1

都認爲大小相同的所有的時間或者是動態的? – John

+2

@John問題很重要,如果視圖尺寸相同,也許你可以使用表視圖而不是不同的視圖。然後製作Rows的動畫。 –

+0

@John他們是動態的,高度與superView成正比。 View1是頭部的頂部約束,View1頂部約束是View1。我想我必須改變它? – Makaille

回答

3

我認爲這樣做將是對連接頭兩個意見topConstraint,然後改變其值的最佳方式過渡的動畫。你可以做類似這樣的方式:

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() 
    }) 
} 

您還可以創建在故事板NSLayoutConstraint,並有一個出口,而不是我所創建的變量或設置在故事板兩個視圖頂部約束「刪除在建造時「,如果你正在做這兩件事。這樣,你會不會有2個頂部約束和無約束warrning

+0

這使我的觀點正確2設置爲頭,但廠景消失 – Makaille

+0

確保當您運行的功能view2.frame.height設置。如果您已經知道您應該嘗試用比例替換它的比例。我將編輯與您如何使用比例 – John

+0

我覺得是做一些衝突的約束,因爲我在調試器已經代替它的響應:UIViewAlertForUnsatisfiableConstraints警告 – Makaille

0

我提出的實施例:https://dl.dropboxusercontent.com/u/24078452/MovingView.zip

我剛創建一個故事板與3查看,接頭,視圖1(紅色)和View 2(黃色)。然後我說IBoutlets和動畫他們在viewDid出現,這裏是代碼:

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

你好@Makaille我已經嘗試解決您的問題。 我已經做了一個例子,它會幫助你實現你的需求。 這裏檢查:Source Code

我希望它會幫助你。

@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

感謝您的時間,我沒有使用底部約束,因爲我的比例身高我會盡量適應它,它看起來很棒。只有一個問題,爲什麼優先級爲249?低點是隨機的嗎? – Makaille

+0

因爲當我們想要在運行時改變優先級,我們必須設置250到249和1000到999,否則我們會遇到問題。 –

+0

向下選民應該把他們的意見太.... –