2017-07-30 58 views
0

我有一個我已經設置的位置和大小,通過約束的視圖:動畫約束編程夫特3

oV.centerXAnchor.constraint(equalTo: self.mapViewController.view.centerXAnchor).isActive = true 
    oV.centerYAnchor.constraint(equalTo: self.mapViewController.view.centerYAnchor).isActive = true 
    oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -overlaySpacing).isActive = true 
    oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -overlaySpacing).isActive = true 

然而,我想要的OV(視圖),以開始作爲比這更小的和動畫的在一秒鐘內的最終尺寸。

oV.centerXAnchor.constraint(equalTo: self.mapViewController.view.centerXAnchor).isActive = true 
oV.centerYAnchor.constraint(equalTo: self.mapViewController.view.centerYAnchor).isActive = true 
oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -2 * overlaySpacing).isActive = true 
oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -2 * overlaySpacing).isActive = true 

我寫的初始約束條件是常量是(-2 * overlaySpacing)。最後的約束是寬度/高度常量只是-overlaySpacing。

我已經以編程方式編寫了所有內容,故事板解決方案無濟於事。

這是我當前的代碼進行動畫處理,但它只是自動顯示爲最終約束:

讓OV = NewOverlayView(的viewController:MVC,框架:CGRect.zero)

self.mapViewController.view.addSubview(oV) 

    oV.centerXAnchor.constraint(equalTo: self.mapViewController.view.centerXAnchor).isActive = true 
    oV.centerYAnchor.constraint(equalTo: self.mapViewController.view.centerYAnchor).isActive = true 
    var widthConstraint = oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -2 * overlaySpacing) 
    var heightConstraint = oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -2 * overlaySpacing) 

    widthConstraint.isActive = true 
    heightConstraint.isActive = true 

    oV.layoutIfNeeded() 

    widthConstraint.isActive = false 
    heightConstraint.isActive = false 

    widthConstraint = oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -overlaySpacing) 
    heightConstraint = oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -overlaySpacing) 

    widthConstraint.isActive = true 
    heightConstraint.isActive = true 

    UIView.animate(withDuration: 1.0) { oV.layoutIfNeeded() } 

謝謝!

回答

0

的屬性觀察者與proper function的動畫可以是一個解決辦法:

設置一個變量在你的控制器與這樣的「didSet」觀察員:

var dynamicOverlaySpacing = 0 { 
    didSet { 
      //Remove previous constraints ?   
      oV.widthAnchor.constraint(equalTo: self.mapViewController.view.widthAnchor, constant: -dynamicOverlaySpacing).isActive = true 
      oV.heightAnchor.constraint(equalTo: self.mapViewController.view.heightAnchor, constant: -dynamicOverlaySpacing).isActive = true 
     } 
    } 


永遠time的值dynamicOverlaySpacing被更改,didSet關閉中的代碼將被執行。

2.

製作一個動畫,會慢慢改變 dynamicOverlaySpacing的價值

像這樣的東西應該工作:

let delay = 2.0 //the delay you want for the animation 
let firstOverlaySpacing = dynamicOverlaySpacing 
oV.animate(withDuration: 0, delay: delay, options: .curveEaseIn, animations: { 
      dynamicOverlaySpacing = -2*firstOverlaySpacing 

      }, completion: nil) 

上的選項,我用curseEaseIn。你可以看到所有可用的選項here.

我沒有嘗試代碼,但它應該工作。