我正在尝试创建一个水平滑动的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应该是它的宽度。else-宽度。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句