UISegue定位UIView中途

时间:2015-09-12 02:51:14

标签: ios swift uiview segue

我正在尝试使用自定义过渡来定位UIView,使其从底部向上滑动,但顶部停在屏幕的一半。我有这个工作,但在中途停留一段时间之后,UIView打开了剩下的路,占据了整个屏幕。这是我正在做的代码。

override func perform() {
    //Coming in here, we already have this information.  The segue knows the source
    //and destination view controllers.
    var firstView = self.sourceViewController.view as UIView!
    var secondView = self.destinationViewController.view as UIView!

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

    //Specify the initial position of the second view.  We're sliding from
    //bottom to top, so put it off the bottom of the screen.
    secondView.frame = CGRectMake(0.0, screenHeight, screenWidth, screenHeight)

    //Insert the second view above the first view. The windows are all in a stack.  Doing
    //this inserts the second view at the top of the statck.  It is not yet visible.
    let window = UIApplication.sharedApplication().keyWindow
    window?.insertSubview(secondView, aboveSubview: firstView)

    //Animate the transition.
    UIView.animateWithDuration(0.5, animations: { () -> Void in
        secondView.frame = CGRectOffset(secondView.frame, 0.0, -screenHeight/2)

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

我在Finished中设置了一个断点,这就是导致第二个视图占用整个屏幕的代码。我该怎么做才能使第二个视图仅占据屏幕的下半部分。

2 个答案:

答案 0 :(得分:5)

'perform'方法用于设置从源到目标控制器的转换动画,但最后一步:

self.sourceViewController.presentViewController(self.destinationViewController as! UIViewController,
            animated: false,
            completion: nil)

显示目标控制器,就iOS而言,它是一个全屏控制器,这就是你在最后看到跳转的原因。

你有几个选择:

<强> 1。假装(选项A):

  • 在故事板中选择您的segue并将演示文稿选项从“默认”(默认值为“全屏”)更改为“当前上下文”。
  • 在目标控制器中,将根视图backgroundColor设置为clear。
  • 添加一个占据视图高度一半的新视图,并将所有人转移到该视图中。

这只适用于非常简单的布局,如果你

将来可能会很头疼

<强> 2。假装(选项B)

不要使用视图控制器 - 只是使用从屏幕底部动画的视图。

如果您正在使用Xcode 7,您可以将UIView放入场景顶部的栏中,当您点击它时,Xcode会将其展开,以便您可以添加子视图等。如果目标视图是一个简单的瞬态查看(如菜单),你已经准备好使用Xcode 7,这可能是个不错的选择。

第3。使用UIPresentationController(推荐)

不使用自定义segue,而是切换到使用UIPresentationController。这可能涉及很多锅炉板,但它真的很简单。

这是一个带有演示控制器的bare-bones example project,就像这样简单:

class HalfScreenPresentation: UIPresentationController {

    override func frameOfPresentedViewInContainerView() -> CGRect {

        let containerFrame = self.containerView!.frame

        return CGRect(x: 0, y: containerFrame.height/2, width: containerFrame.width, height: containerFrame.height/2)

    }
}

这是有效的,因为如果您想要更改此动画(例如从顶部或侧面滑动,或其他一些动画),您的动画将从屏幕底部显示/关闭控制器(这是默认过渡!)转换)你还需要提供一个符合UIViewControllerAnimatedTransitioning要求的对象(大多数情况下就像在执行方法中复制和粘贴代码一样简单)。

我真的很享受UIPresentationController API,并希望你也这样做!

答案 1 :(得分:0)

对于那些希望演示文稿从左侧进入或者想要改变y位置的人,我找到了这个简单的解决方案:

class HalfScreenPresentation: UIPresentationController {

override var frameOfPresentedViewInContainerView : CGRect {

    let containerFrame = self.containerView!.frame

    return CGRect(x: 0, y: 0, width: containerFrame.width/1.5, height: containerFrame.height) //From the left
    return CGRect(x: containerFrame.width/3, y: 0, width: containerFrame.width/1.5, height: containerFrame.height)/from the right
}