我正在尝试使用自定义过渡来定位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中设置了一个断点,这就是导致第二个视图占用整个屏幕的代码。我该怎么做才能使第二个视图仅占据屏幕的下半部分。
答案 0 :(得分:5)
'perform'方法用于设置从源到目标控制器的转换动画,但最后一步:
self.sourceViewController.presentViewController(self.destinationViewController as! UIViewController,
animated: false,
completion: nil)
显示目标控制器,就iOS而言,它是一个全屏控制器,这就是你在最后看到跳转的原因。
你有几个选择:
<强> 1。假装(选项A):
这只适用于非常简单的布局,如果你
将来可能会很头疼<强> 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
}