ios - 执行自定义 segue 时调用不平衡

标签 ios swift segue

我创建了一个自定义转场,它是垂直转场的反向版本,这是我的执行函数:

var sourceViewController = self.sourceViewController as UIViewController!
var destinationViewController = self.destinationViewController as UIViewController!

sourceViewController.view.addSubview(destinationViewController.view)
destinationViewController.view.frame = sourceViewController.view.frame
destinationViewController.view.transform = CGAffineTransformMakeTranslation(0, -sourceViewController.view.frame.size.height)
destinationViewController.view.alpha = 1.0

UIView.animateWithDuration(0.5, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
    destinationViewController.view.transform = CGAffineTransformMakeTranslation(0, 0)
    }) { (finished: Bool) -> Void in
            destinationViewController.view.removeFromSuperview()
            sourceViewController.presentViewController(destinationViewController, animated: false, completion: nil)
    }

当我在我的应用程序中执行它时,它可以正常工作并且动画正是我想要的,但我在控制台中收到此警告:

Unbalanced calls to begin/end appearance transitions for <Custom_Segues.ViewController: 0x7a3f9950>.

我在 Stack Overflow 上阅读了很多关于这个问题的帖子,但没有找到与我的情况相关的帖子,有人知道问题出在哪里吗?我在我的代码上尝试了很多东西,我知道问题出在最后两行,但我不知道要更改什么。

编辑/回答:

阅读答案后,我找到了一个解决方案:更改 View ,然后将旧的 VC 应用到新的 VC 上并制作动画。代码安全,动画结束时没有老VC的闪现。

var sourceViewController = self.sourceViewController as UIViewController!
var destinationViewController = self.destinationViewController as UIViewController!
var duplicatedSourceView: UIView = sourceViewController.view.snapshotViewAfterScreenUpdates(false) // Screenshot of the old view.

destinationViewController.view.addSubview(duplicatedSourceView) // We add a screenshot of the old view (Bottom) above the new one (Top), it looks like nothing changed.

sourceViewController.presentViewController(destinationViewController, animated: false, completion: {
    destinationViewController.view.addSubview(duplicatedSourceView) // We add the old view (Bottom) above the new one (Top), it looks like nothing changed.

    UIView.animateWithDuration(0.33, delay: 0.0, options: UIViewAnimationOptions.CurveEaseOut, animations: { () -> Void in
        duplicatedSourceView.transform = CGAffineTransformMakeTranslation(0, sourceViewController.view.frame.size.height) // We slide the old view at the bottom of the screen
            }) { (finished: Bool) -> Void in
            duplicatedSourceView.removeFromSuperview()
        }
    })
}

最佳答案

这看起来与运行循环计时相关。

destinationViewController.view.removeFromSuperview()
sourceViewController.presentViewController(destinationViewController, animated: false, completion: nil)

这两行不应该在同一个运行循环中执行。

destinationViewController.view.removeFromSuperview()

// Force presentViewController() into a different runloop.
let time = dispatch_time(DISPATCH_TIME_NOW, Int64(0.001 * Double(NSEC_PER_SEC)))
dispatch_after(time, dispatch_get_main_queue()) {
    sourceViewController.presentViewController(destinationViewController, animated: false, completion: nil)
}

关于ios - 执行自定义 segue 时调用不平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25330783/

相关文章:

ios - Snapkit,将 UILabel 粘到底部

ios - 向应用程序发送静默推送通知,更新位置并在后台发送到服务器

ios - 动态添加部分到 UITableView,然后动态添加子单元格到特定部分。

ios - Segue 不显示导航栏

ios - 在 ionic 2 应用程序中更改 iOS 状态栏颜色

ios - 自定义 UICollectionViewCell 不显示 UIImage 和崩溃

arrays - 有没有办法获取对象中属性值的数组?

swift - ViewController 之间传递数据取决于 UIButton 的标签

swift - Swift 中没有带有标识符错误的 Segue?

ios - 如何在不通过序列的情况下在 GPUImage 的视频上混合 2 个 LUT 的输出?