呈现未注册的UIViewController触摸事件

时间:2015-07-11 19:03:32

标签: objective-c xcode swift uiviewcontroller

我的视图控制器a(VC_A)将出现在视图控制器上的自定义转换事件(VC_B)。

现在进行转换时,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);

    }

}

}

1 个答案:

答案 0 :(得分:0)

好的我发现了问题,我需要将视图添加到内容子视图

    private static DependencyObject GetNextSiblingInVisualTree(DependencyObject origin)
    {
        DependencyObject parent = VisualTreeHelper.GetParent(origin);

        if (parent != null)
        {
            int childIndex = -1;
            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); ++i)
            {
                if (origin == VisualTreeHelper.GetChild(parent, i))
                {
                    childIndex = i;
                    break;
                }
            }

            for (int nextIndex = childIndex + 1; nextIndex < VisualTreeHelper.GetChildrenCount(parent); nextIndex++ )
            {
                DependencyObject currentObject = VisualTreeHelper.GetChild(parent, nextIndex);

                if( currentObject.GetType() == typeof(TextBox))
                {
                    return currentObject;
                }
            }
        }

        return null;
    }

这当然会导致上下文完成时的错误,从关键窗口中删除视图。

所以我需要在上下文完成后添加这一行:

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

让它正常工作