0

私は本当にこの場合について1週間で立ち往生しました。 iはUINavigationItem内部UIBarButtonItemを持って、階層がこのtouchesBeganとtouchesEndedが別のサブビューで検出されました

alt text

のようなものですBarButtonItemはsegmentedControlのラッパーです。 UIBarbuttonitemおよびUIsegmentedControlはプログラムによって作成されますが、その他はIBで作成されます。

この場合、barbuttonitemを押すか、またはタッチした後で表示したいと思います。このフォーラムで読んだいくつかのスレッドでは、UIBarbuttonItemがUIResponderを継承していないことを知っていたので、NavigationBarを選択してタッチを取得し、フレームを定義します。

これは私が作ったコードは次のとおり

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ 
navBar = self.navigationController.navigationBar; 
int index = _docSegmentedControl.selectedSegmentIndex; 
NSLog(@"index di touches began : %d", index); 
CGFloat x; 

if (index == 0) { 
    x = 0.0; 
}else if (index == 1) { 
     x = widthSegment + 1; 
}else if (index == 2) { 
     x = 2*widthSegment + 1; 
}else if (index == 3) { 
     x = 3*widthSegment+ 1; 
}else if (in dex == 4) { 
     x = 4*widthSegment + 1; 
} 

CGRect frame = CGRectMake(x, 0.00, widthSegment, 46.00); 

UITouch *touch = [touches anyObject]; 
CGPoint gestureStartPoint = [touch locationInView:navBar]; 

NSLog(@"gesturestart : %f, %f", gestureStartPoint.x, gestureStartPoint.y); 

if (CGRectContainsPoint(frame, gestureStartPoint)) { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(segmentItemTapped:) object:[self navBar]]; 
    NSLog(@"cancel popover"); 
} 
} 

ナビゲーションバーはmyViewController.hに宣言し、私はIBOutletとして設定しました。

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
int index = _docSegmentedControl.selectedSegmentIndex; 
NSLog(@"index di touches ended : %d", index); 
navBar = self.navigationController.navigationBar; 
CGFloat x; 

if (index == 0) { 
     x = 0.0; 
}else if (index == 1) { 
     x = widthSegment + 1; 
}else if (in dex == 2) { 
     x = 2*widthSegment + 1; 
}else if (index == 3) { 
     x = 3*widthSegment+ 1; 
}else if (index == 4) { 
     x = 4*widthSegment + 1; 
} 

CGRect frame = CGRectMake(x, 0.00, widthSegment, 46.00); 

UITouch *touch = [touches anyObject]; 
CGPoint gestureLastPoint = [touch locationInView:navBar]; 

NSLog(@"lastPOint : %d", gestureLastPoint); 

if (CGRectContainsPoint(frame, gestureLastPoint)) { 
    if (touch.tapCount <= 2) { 
      [self performSelector:@selector(segmentItemTapped:) withObject:nil afterDelay:0.0]; 
    } 
} 
} 

touchesBeganとtouchesEndedは、ツールバーでタップしたときに検出されました。ナビゲーションバーでは検出されませんでした。

私はこのようなHitTestメソッドを実装しました:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    UIView *touchedView = [super hitTest:point withEvent:event]; 
    NSSet* touches = [event allTouches]; 
    // handle touches if you need 
    return touchedView; 
} 

が、それはまだ何も良くありません。

これがなぜ起こるのか誰かが解説できますか? よろしく
-Risma-

答えて

0

あなたは、単にあなたの助けのAJIのため

[self.mybarbutton setAction:@selector(barButtonTapped:)]; 

[self.mybarbutton setTarget:self]; 
+0

THXなどのbarbutton項目にアクションを追加することができますが、それは私の問題を解決することはできません、segmentItemTapアクションがためのアクションですあなたのコードを試してみたら、ポップオーバーは来なかった、私は検出されなかったタッチについて考えていたビーガンとタッチ私のnavbarEnded、あなたはなぜ知っていますか? –

関連する問題