123cantworkitout
123cantworkitout

Reputation: 11

UIStoryboardSegue: top view is not sliding down

I have the following swift code and what i am trying to achieve is a segue that slides off the top. I want the secondVCView to be below the firstVCView and for the firstVCView to slide off displaying the secondVCView.

Currently there is no animation and it just flashes to the secondVCView.

Many Thanks

import UIKit

class TopToBottomSegue: UIStoryboardSegue {

override func perform() {

    // Assign the source and destination views to local variables.
    var firstVCView = self.sourceViewController.view as UIView!
    var secondVCView = self.destinationViewController.view as UIView!

    // Get the screen width and height.
    let screenWidth = UIScreen.mainScreen().bounds.size.width
    let screenHeight = UIScreen.mainScreen().bounds.size.height

    // Specify the initial position of the destination view.
    secondVCView.frame = CGRectMake(0, 0, screenWidth, screenHeight)

    // Access the app's key window and insert the destination view below the current (source) one.
    let window = UIApplication.sharedApplication().keyWindow
    window?.insertSubview(secondVCView, belowSubview: firstVCView)

    // Animate the transition.
    UIView.animateWithDuration(0.4, animations: { () -> Void in

        firstVCView.frame = CGRectOffset(firstVCView.frame, 0.0, screenHeight)
        //secondVCView.frame = CGRectOffset(secondVCView.frame, -screenWidth, 0.0)

        }) { (Finished) -> Void in
            self.sourceViewController.presentViewController(self.destinationViewController as! UIViewController,
                animated: false,
                completion: nil)
    }

  }
}

Upvotes: 1

Views: 103

Answers (2)

123cantworkitout
123cantworkitout

Reputation: 11

Im not sure if this is the correct way to do this but i managed to get it working by inserting both views.

L

--

import UIKit

class TopToBottomSegue: UIStoryboardSegue {

override func perform() {
    // Assign the source and destination views to local variables.
    let firstVCView = self.sourceViewController.view as UIView!
    let secondVCView = self.destinationViewController.view as UIView!

    // Get the screen width, height and status bar height.
    let screenWidth = UIScreen.mainScreen().bounds.size.width
    let screenHeight = UIScreen.mainScreen().bounds.size.height
    let statusBarHeight = self.statusBarHeight()

    // Specify the initial position of both views.
    secondVCView.frame = CGRectMake(0.0, 0.0, screenWidth, screenHeight)
    firstVCView.frame = CGRectMake(0.0, statusBarHeight, screenWidth, screenHeight)

    // Access the app's key window and insert the destination view below the current (source) one.
    let window = UIApplication.sharedApplication().keyWindow
    window?.insertSubview(firstVCView, aboveSubview: secondVCView)
    window?.insertSubview(secondVCView, belowSubview: firstVCView)

    // Animate the transition.
    UIView.animateWithDuration(0.3, animations: { () -> Void in

        firstVCView.frame = CGRectOffset(firstVCView.frame, 0.0, screenHeight)

        }) { (Finished) -> Void in
            self.sourceViewController.presentViewController(self.destinationViewController as UIViewController,
                animated: false,
                completion: nil)
    }

}
func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.sharedApplication().statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}
}

Upvotes: 0

VictorG
VictorG

Reputation: 186

As far as I know you need to call layoutIfNeed inside animateWithduration block in order to get a smooth animation.

Greetings

Upvotes: 1

Related Questions