2017-06-06 90 views
0

我試圖在UIView出現在屏幕上時使用動畫過渡。 UIView正確顯示,但是動畫在出現時不會發生。UIView過渡動畫沒有執行

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

    let coreView = UIView(frame: CGRect(x: 10, y: 10, width: 100, height: 100)) 
    coreView.backgroundColor = UIColor.cyan 
    coreView.layer.borderColor = UIColor.darkGray.cgColor 
    coreView.layer.borderWidth = 8 
    coreView.layer.cornerRadius = 15 
    coreView.isHidden = true 
    self.view.addSubview(coreView) 

    //The transition occurs here 
    UIView.transition(with: coreView, duration: 2, options: [.curveEaseInOut, .transitionCurlDown], animations: { 

     coreView.isHidden = false 
    }, completion: {_ in}) 

    } 

回答

0

這是行不通的,因爲在viewWillAppear方法完成之前,CoreView沒有正確設置,因此您無法使用過渡動畫(您可以使用其他屬性(如alpha)進行動畫製作)。

你可以做的是這樣的:

DispatchQueue.main.async { 
    coreView.isHidden = false 

    UIView.transition(with: coreView, duration: 2, options: [.curveEaseInOut, .transitionCurlDown], animations: { 
    }, completion: {_ in}) 

} 

這分派過渡返回到主隊列,它激發了viewWillAppear中方法已經完成並且coreView正確設置。

順便記住,viewWillAppear是每當視圖控制器進入視圖時調用,所以如果它隱藏並返回,您將添加另一個coreView。

+0

就這樣做了!它現在工作:) – SwiftyJD

0

嘗試在動畫塊你coreView隱藏代碼之後加入self.view.layoutIfNeeded()

1

而不是操縱isHidden coreView屬性使用alpha屬性。

嘗試更換coreView.isHidden =真coreView.alpha = 0並在動畫塊替換coreView.isHidden =假coreView.alpha = 1

這應該是它我猜。它應該動畫。謝謝。

+0

作爲一般規則,並非所有屬性都是*動畫*。當UIView的屬性是動畫的時,它總是在文檔中明確提到。 'isHidden'不是可以動畫的。 – deadbeef

+0

這是一個過渡動畫,可以在添加或取消層次結構時起作用。當視圖被添加到故事板時它可以工作,但是由於這個視圖是以編程方式創建的,所以它不起作用 – SwiftyJD