2015-07-30 3 views
0

Я нашел хранилище GitHub, где пользователь создал запуск анимации, как в щебечет приложение: ThisSwift: Можно ли удалить View Controller из стека?

Это работает лучше всего, если значок является твердой форме и центрируется на экране.

Моя проблема заключается в том, что я могу центрировать свою иконку, потому что она разработана. Поэтому, когда моя анимация закончена, приложение все равно останется на экране с маскированием слева от предыдущего контроллера просмотра, который сделал анимацию.

Как можно полностью удалить этот контроллер просмотра после завершения анимации, и приложение попадает в режим просмотра таблицы View Controller?

Вот мой код:

self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window!.backgroundColor = UIColor(red: 241/255, green: 196/255, blue: 15/255, alpha: 1) 
     self.window!.makeKeyAndVisible() 

     // rootViewController from StoryBoard 
     let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     var navigationController = mainStoryboard.instantiateViewControllerWithIdentifier("navigationController") as! UIViewController 
     self.window!.rootViewController = navigationController 

     // logo mask 
     navigationController.view.layer.mask = CALayer() 
     navigationController.view.layer.mask.contents = UIImage(named: "logo.png")!.CGImage 
     navigationController.view.layer.mask.bounds = CGRect(x: 0, y: 0, width: 10, height: 10) 
     navigationController.view.layer.mask.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
     navigationController.view.layer.mask.position = CGPoint(x: navigationController.view.frame.width/2, y: navigationController.view.frame.height/2) 

     // logo mask background view 
     var maskBgView = UIView(frame: navigationController.view.frame) 
     maskBgView.backgroundColor = UIColor.whiteColor() 
     navigationController.view.addSubview(maskBgView) 
     navigationController.view.bringSubviewToFront(maskBgView) 

     // logo mask animation 
     let transformAnimation = CAKeyframeAnimation(keyPath: "bounds") 
     transformAnimation.delegate = self 
     transformAnimation.duration = 1 
     transformAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second 
     let initalBounds = NSValue(CGRect: navigationController.view.layer.mask.bounds) 
     let secondBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 50, height: 50)) 
     let finalBounds = NSValue(CGRect: CGRect(x: 0, y: 0, width: 2000, height: 2000)) 
     transformAnimation.values = [initalBounds, secondBounds, finalBounds] 
     transformAnimation.keyTimes = [0, 0.5, 1] 
     transformAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)] 
     transformAnimation.removedOnCompletion = false 
     transformAnimation.fillMode = kCAFillModeForwards 
     navigationController.view.layer.mask.addAnimation(transformAnimation, forKey: "maskAnimation") 

     // logo mask background view animation 
     UIView.animateWithDuration(0.1, 
      delay: 1.35, 
      options: UIViewAnimationOptions.CurveEaseIn, 
      animations: { 
       maskBgView.alpha = 0.0 
      }, 
      completion: { finished in 
       maskBgView.removeFromSuperview() 
     }) 

     // root view animation 
     UIView.animateWithDuration(0.25, 
      delay: 1.3, 
      options: UIViewAnimationOptions.TransitionNone, 
      animations: { 
       self.window!.rootViewController!.view.transform = CGAffineTransformMakeScale(1.05, 1.05) 
      }, 
      completion: { finished in 
       UIView.animateWithDuration(0.3, 
        delay: 0.0, 
        options: UIViewAnimationOptions.CurveEaseInOut, 
        animations: { 
         self.window!.rootViewController!.view.transform = CGAffineTransformIdentity 
        }, 
        completion: nil 
       ) 
     }) 

И проблема еще хуже на IPad, где экран больше = больше маскировки слева на экране.

ответ

1

Вам необходимо удалить маску после завершения анимации.

UIView.animateWithDuration(0.25, 
     delay: 1.3, 
     options: UIViewAnimationOptions.TransitionNone, 
     animations: { 
      self.window!.rootViewController!.view.transform = CGAffineTransformMakeScale(1.05, 1.05) 
     }, 
     completion: { finished in 
      UIView.animateWithDuration(0.3, 
       delay: 0.0, 
       options: UIViewAnimationOptions.CurveEaseInOut, 
       animations: { 
        self.window!.rootViewController!.view.transform = CGAffineTransformIdentity 
       }, 
       completion: { 
        // ADDED THIS LINE 
        self.window!.rootViewController!.view.layer.mask = nil 
       } 
      ) 
    }) 
+0

Пользуясь тем, что я получаю ошибку: не может ссылаться на animateWithDuration со списком аргументов типа: (двойными, задержки: двойной, опции: UIViewAnimationOptions, анимация:() -> _, завершение: (_) -> _) – user2722667

+0

получил (а) его работу: – user2722667