0

iPadアプリにボタンがあり、それを押すとaddGestureRecognizerのものになります。もう一度押すと、それらが削除されるはずです。

私のコードは if ブロックにあり、NSLog が正しいログ メッセージを出力するため、正しいコード ブロックが実行されていることがわかります。

次のように認識機能を追加しています。

[self.view addGestureRecognizer:panRecognizer];
[self.view addGestureRecognizer:pinchRecognizer];
[self.view addGestureRecognizer:rotationRecognizer];
[self.view addGestureRecognizer:tapRecognizer];

そして、次のようにそれらを削除しようとしています:

[self.view removeGestureRecognizer:panRecognizer];
[self.view removeGestureRecognizer:pinchRecognizer];
[self.view removeGestureRecognizer:rotationRecognizer];
[self.view removeGestureRecognizer:tapRecognizer]; 

これは私の機能全体です: http://www.pastelib.com/show/ZlICyb9Q

うまくいかず、理由がわかりません。何か提案はありますか?

すべての助けと提案を前もってありがとう:)

4

2 に答える 2

2

GestureReconizers は -showMenu: メソッドに対してローカルに宣言されます。したがって、ボタンが押されるたびに、新しい GestureReconizers が作成されるため、以前の reconizers を削除しようとはしませんでしたが、新しく作成された reconizers を削除しようとします。

reconizers オブジェクトのスコープを変更すると、問題が修正されます。

乾杯。

コードサンプルで編集:

-(IBAction) showMenu:(id) sender {    
    if([self.view.subviews containsObject:menuView]) {

        NSLog(@"remove gestures!");

        // Dismiss menu
        [menuView removeFromSuperview];

        // Remove gestures
        [self.view removeGestureRecognizer:panRecognizer];
        [self.view removeGestureRecognizer:pinchRecognizer];
        [self.view removeGestureRecognizer:rotationRecognizer];
        [self.view removeGestureRecognizer:tapRecognizer];        
    }else{
        // Create menu        
        NSLog(@"add gestures!");

    panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panDetected:)];

    pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchDetected:)];

    rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationDetected:)];

    tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapDetected:)];

     tapRecognizer.numberOfTapsRequired = 2;    

     // Make gestures work simultaneously
     panRecognizer.delegate = self;
     pinchRecognizer.delegate = self;
     rotationRecognizer.delegate = self;

        // Set width and height if empty        
       self.menuController = [[menuController alloc] initWithNibName:@"menuController" bundle:nil];

        if(screenWidth == 0) {

            UIInterfaceOrientation currentOrientation = [[UIApplication sharedApplication] statusBarOrientation];

            if(currentOrientation == 1 || currentOrientation == 2) {
                // portrait
                screenHeight    = self.menuController.view.frame.size.height;
                screenWidth     = self.menuController.view.frame.size.width;
            }else{
                // Landscape
                screenHeight     = self.menuController.view.frame.size.width;
                screenWidth    = self.menuController.view.frame.size.height+20; //height+20px for the status bar
            }
        }

        int menuHeight = 80;
        self.menuController.view.frame = CGRectMake(0,screenHeight-(menuHeight-20), screenWidth, menuHeight);

        self.menuView = self.menuController.view;

        [self.menuController setDelegate:self];

        [self addChildViewController:self.menuController];
        [self.menuController didMoveToParentViewController:self];
        [self.view addSubview:menuView];


        // Add image gestures
        [self.view addGestureRecognizer:panRecognizer];
        [self.view addGestureRecognizer:pinchRecognizer];
        [self.view addGestureRecognizer:rotationRecognizer];
        [self.view addGestureRecognizer:tapRecognizer];

        [self.view bringSubviewToFront:menuButton];        

    }
}
于 2012-11-24T13:42:31.987 に答える