2015-07-11 95 views
0

我有一個自定義的轉換事件與視圖控制器a(VC_A)將出現在視圖控制器(VC_B)。介紹未註冊的UIViewController觸摸事件

現在在做轉型的時候,VC_A仍將存在,但VC_B不會接收任何觸摸事件。現在,如果我從VC_A中刪除視圖,VC_B將獲得觸摸事件。我不確定我的轉換中缺少什麼,它告訴應用程序將所有觸摸事件發送到VC_B而不是VC_A。我曾嘗試設置第一響應者,但那不起作用,如果有人能告訴我我缺少什麼,那將不勝感激。

// 
// AnimationController.swift 
// MarineWars 
// 
//  Created by Anthony Randazzo on 5/6/15. 
// Copyright (c) 2015 Anthony Randazzo. All rights reserved. 
// 

import Foundation 
import UIKit 


class TransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate { 
func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    return AnimationController(transitionType: .Presenting) 
} 

func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { 
    return AnimationController(transitionType: .Dismissing) 
} 
func interactionControllerForDismissal(animator: UIViewControllerAnimatedTransitioning) -> UIViewControllerInteractiveTransitioning? 
{ 
    return nil; 
} 
} 

private var inSuperView : UIView?; 
private var toSuperView : UIView?; 

class AnimationController: NSObject,  UIViewControllerAnimatedTransitioning { 

enum TransitionType { 
    case Presenting 
    case Dismissing 
} 

var animationTransitionOptions: UIViewAnimationOptions 
var inView : UIView?; 
var toView : UIView?; 
var fromView : UIView?; 

init(transitionType: TransitionType) { 
    switch transitionType { 
    case .Presenting: 
     animationTransitionOptions = .TransitionFlipFromLeft 
    case .Dismissing: 
     animationTransitionOptions = .TransitionFlipFromRight 
    } 

    super.init() 

} 

func animateTransition(transitionContext: UIViewControllerContextTransitioning) { 
    inView = transitionContext.containerView() 
    toView = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey)?.view // if iOS 8 only, I'd use `viewForKey`, instead 
    fromView = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey)?.view 
    if(animationTransitionOptions == .TransitionFlipFromLeft) 
    { 
    NSTimer.scheduledTimerWithTimeInterval(transitionDuration(transitionContext)/2, target: self, selector: Selector("fireHalfwayIn"), userInfo: nil, repeats: false); 
    } 
    else if(animationTransitionOptions == .TransitionFlipFromRight) 
    { 
     NSTimer.scheduledTimerWithTimeInterval(transitionDuration(transitionContext)/2, target: self, selector: Selector("fireHalfwayOut"), userInfo: nil, repeats: false); 
    } 
    var scene = GameScene.instance; 
    scene!.paused = false; 
    scene!.view?.paused = false; 
    UIView.transitionFromView(fromView!, toView: toView!, duration: transitionDuration(transitionContext), options: animationTransitionOptions | .CurveEaseInOut | .AllowAnimatedContent) { finished in 

     transitionContext.completeTransition(true) 
     NSNotificationCenter.defaultCenter().postNotificationName("DropNotifications",object:nil); 

     //inSuperView is our parent 

     if(inSuperView == nil) 
     { 
      inSuperView = self.fromView; 
      println(self.fromView); 
      for view in self.fromView!.subviews 
      { 
       for subview in view.subviews 
       { 
        if(subview.isMemberOfClass(GameSceneView)) 
        { 
         self.fromView!.resignFirstResponder() 
         self.toView!.becomeFirstResponder(); 
         (subview as! GameSceneView).removeScene(); 
         return; 
        } 
       } 

       if(view.isMemberOfClass(GameSceneView)) 
       { 
        self.fromView!.resignFirstResponder() 
        self.toView!.becomeFirstResponder(); 
        (view as! GameSceneView).removeScene(); 
        return; 
       } 
      } 


     } 
     else 
     { 
      for view in self.toView!.subviews 
      { 
       for subview in view.subviews 
       { 
        if(subview.isMemberOfClass(GameSceneView)) 
        { 
         (subview as! GameSceneView).createScene(); 
         break; 
        } 
       } 
      } 
     } 

    } 
} 

func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { 
    return 1.0 
} 
func fireHalfwayIn() 
{ 
    //println("\nFire In\n"); 
    var scene = GameScene.instance; 
    //scene!.paused = false; 
    if(scene!.player.grid.parent != nil) 
    { 
     scene!.currentPlayer = scene!.enemy; 

     scene!.player.grid.removeFromParent(); 
     scene!.addChild(scene!.enemy.grid); 
     var player = scene!.currentPlayer; 



     player!.grid.position = GameScene.fixPositionOnScreen(CGPointMake(toView!.frame.width/2 - player!.gridSize.width/2, toView!.frame.height/2 - player!.gridSize.height/2),currentPlayer: player!); 

    } 
} 
func fireHalfwayOut() 
{ 
    // println("\nFire Out\n"); 
    var scene = GameScene.instance; 
    if(scene!.enemy.grid.parent != nil) 
    { 
     scene!.enemy.grid.removeFromParent(); 
     scene!.currentPlayer = scene!.player; 

     scene!.addChild(scene!.player.grid); 

    } 

} 

} 
+0

您可以發佈您的自定義轉換一些代碼?我記得在我的轉換上下文('UIViewControllerContextTransitioning')中沒有調用'completeTransition(_ :)'的類似問題。 –

+0

好吧我清理了一下這個班,發佈了它,希望它有幫助。 – Knight0fDragon

+0

http://stackoverflow.com/questions/22300050/touches-not-recognized-after-custom-transition是一個類似的問題,但當然,答案不是我可以接受的答案,我寧願保持視圖加載爲了我所做的。 – Knight0fDragon

回答

0

OK,我發現這個問題,我需要的視圖添加到內容子視圖

if(self.presenting) 
    { 
     self.inView!.addSubview(self.toView!); 
    } 

當然,這導致當上下文結束一個錯誤,從鑰匙取出從視圖窗口。

所以,我需要添加此行之後的背景下完成的:

UIApplication.sharedApplication().keyWindow!.addSubview(self.toView!); 

得到它才能正常工作