0

J'ai vraiment été bloqué dans une semaine à propos de cette affaire. j'ai un UIBarButtonItem intérieur UINavigationItem, la hiérarchie est comme çatouchesBegan et touchEnded détecté sur une autre sous-vue

alt text

Le BarButtonItem est une enveloppe de segmentedControl. Les UIBarbuttonitem et UIsegmentedControl sont créés par programme, mais les autres sont créés dans IB. Dans ce cas, je veux afficher une vue après avoir appuyé sur ou appuyé sur le bouton-poussoir. Dans plusieurs threads que j'ai lus dans ce forum, je savais que UIBarbuttonItem n'héritait pas de UIResponder, donc j'ai choisi le NavigationBar pour obtenir le toucher, et je définis un cadre pour cela.

c'est le code que je fait:

-(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"); 
} 
} 

la barre de navigation était déclarer dans myViewController.h et je le définir comme un 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 et touchesEnded a été détectée quand je tape dans la barre d'outils, pas dans la barre de navigation.

je n'implémentait la méthode hitTest comme ceci:

- (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; 
} 

mais toujours rien mieux.

Quelqu'un peut-il expliquer pourquoi cela est arrivé? Cordialement
-Risma-

Répondre

0

vous pouvez simplement ajouter une action à l'élément barbutton comme

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

[self.mybarbutton setTarget:self]; 
+0

thx pour votre aji d'aide, mais il ne peut pas résoudre mon problème, l'action segmentItemTap est une action montrer un popover, quand j'essaye votre code, le popover n'est pas venu, je pensais aux touches non détectéesBegan et toucheEnded dans ma barre de navigation, savez-vous pourquoi ?? –