我正在尝试创建一个水平滑动的segue,可以从一个 View 平移到下一个 View 。我向下平移,但它在应该显示下一个 View Controller 的区域中显示了一个黑色空间。这就是我实现 segue 的方式
class SlideSegue: UIStoryboardSegue {
enum Direction {
case Left
case Right
}
// MARK: - Properties
var direction = Direction.Left
// MARK: -
override func perform() {
let srcVc = self.sourceViewController
let destVc = self.destinationViewController
let destView = destVc.view.snapshotViewAfterScreenUpdates(true)
var frame = destView.frame
frame.origin.x = CGFloat(valForDirection()) * srcVc.view.frame.width
destView.frame = frame
srcVc.view.addSubview(destView)
UIView.animateWithDuration(0.3, animations: { () -> Void in
let x = CGFloat(self.valForDirection()) * srcVc.view.bounds.width
let slide = CGAffineTransformMakeTranslation(x, 0)
srcVc.view.transform = slide
}) { (finished: Bool) -> Void in
srcVc.presentViewController(destVc, animated: false, completion: nil)
destView.removeFromSuperview()
}
}
func valForDirection() -> Int {
return direction == Direction.Left ? -1 : 1
}
}
class SlideLeftSegue: SlideSegue {
override func perform() {
self.direction = Direction.Left
super.perform()
}
}
class SlideRightSegue: SlideSegue {
override func perform() {
self.direction = Direction.Right
super.perform()
}
}
编辑
编辑(已解决) 这是最终的工作解决方案,感谢下面的两个答案
class SlideSegue: UIStoryboardSegue {
enum Direction: Int {
case Left = 1
case Right = -1
}
// MARK: - Properties
var direction = Direction.Left
// MARK: -
override func perform() {
let srcVc = self.sourceViewController
let destVc = self.destinationViewController
let destView = destVc.view.snapshotViewAfterScreenUpdates(true)
var frame = destView.frame
frame.origin.x = CGFloat(direction.rawValue) * srcVc.view.frame.width
destView.frame = frame
srcVc.view.addSubview(destView)
UIView.animateWithDuration(0.3, animations: { () -> Void in
let x = -CGFloat(self.direction.rawValue) * srcVc.view.bounds.width
let slide = CGAffineTransformMakeTranslation(x, 0)
srcVc.view.transform = slide
}) { (finished: Bool) -> Void in
srcVc.presentViewController(destVc, animated: false, completion: nil)
destView.removeFromSuperview()
}
}
}
class SlideLeftSegue: SlideSegue {
override func perform() {
self.direction = Direction.Left
super.perform()
}
}
class SlideRightSegue: SlideSegue {
override func perform() {
self.direction = Direction.Right
super.perform()
}
}
最佳答案
我测试了以下修改,效果很好。
func valForDirection() -> Int {
return direction == Direction.Left ? 1 : -1
}
如果向左滑动,destView的originX应该是它的宽度。否则-宽度。
关于ios - Swift 中的幻灯片转场,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33624133/