ios - Swift 中的幻灯片转场

标签 ios swift swift2

我正在尝试创建一个水平滑动的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/

相关文章:

ios - UIApplication.shared.applicationIconBadgeNumber 滞后

ios - 我在检查闭包中是否为 nil 时收到错误

ios - 为什么我的完成键没有退出键盘?

ios - 如何将用户输入的文本保存到 UITextView 中

ios - 选择不同的选项卡时更改导航栏标题

ios - 选择 x 编号来自长数组的项目并在表格 View 中滚动显示更多

Swift 序列协议(protocol)的 Swift 2 到 3 迁移

iOS - Accelerate.framework 中矩阵的逐元素条件边界

iphone - iOS下载并在应用程序内保存图像

ios - 将操作按钮图形设置为 UIButton