UIBarButtonItem
ne pas étendre UIView
, donc il n'y a rien comme un cadre de propriété.
Mais est-il possible que je peux obtenir ce que c'est que c'est CGRect
cadre, relative à l'application UIWindow
?
UIBarButtonItem
ne pas étendre UIView
, donc il n'y a rien comme un cadre de propriété.
Mais est-il possible que je peux obtenir ce que c'est que c'est CGRect
cadre, relative à l'application UIWindow
?
Aimez-vous l'utilisation privée de l'APIs? Si oui,
UIView* view = thatItem.view;
return [view convertRect:view.bounds toView:nil];
Bien sûr, personne ne veut que cela lors du ciblage de l'AppStore. Un plus fiable de la méthode, et utilise également des fonctionnalités non documentées, mais passera Apple test, est d'une boucle sur le sous-vues de chercher le bouton correspondant à l'élément.
NSMutableArray* buttons = [[NSMutableArray alloc] init];
for (UIControl* btn in theToolbarOrNavbar.subviews)
if ([btn isKindOfClass:[UIControl class]])
[buttons addObject:btn];
UIView* view = [buttons objectAtIndex:index];
[buttons release];
return [view convertRect:view.bounds toView:nil];
L' index
est l'indice à votre élément de barre dans le tableau d' .items
, après le retrait de tous les éléments vides. Cela suppose que les boutons sont disposés en ordre croissant, ce qui peut ne pas l'être. Une méthode plus fiable est de trier l' buttons
tableau en augmentant .origin.x
de la valeur. Bien sûr, cela toujours suppose le bouton de la barre d'élément doit hériter de la UIControl classe, et sont direct des sous-vues de la barre d'outils/nav-bar, ce qui pourrait ne pas l'être.
Comme vous pouvez le voir, il ya beaucoup d'incertitude lorsqu'ils traitent avec des fonctionnalités non documentées. Cependant, vous voulez juste pop up de quelque chose sous le doigt vers la droite? Le UIBarButtonItem de l' .action
peut être un sélecteur de la forme:
-(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event;
remarque le cas de l'argument - vous pouvez obtenir la position de contact avec
[[event.allTouches anyObject] locationInView:theWindow]
ou le bouton de la vue avec
[[event.allTouches anyObject] view]
Par conséquent, il n'y a pas besoin de parcourir les sous-vues ou d'utiliser des fonctions non documentées de ce que vous voulez faire.
Dans iOS 3.2, il y a un moyen beaucoup plus facile de montrer une Action de la Feuille de liste à partir d'un bouton de barre d'outils. Simplement faire quelque chose comme ceci:
- (IBAction)buttonClicked:(UIBarButtonItem *)sender event:(UIEvent *)event
{
UIActionSheet *popupSheet;
// Prepare your action sheet
[popupSheet showFromBarButtonItem:sender animated:YES];
}
C'est l'application que j'utilise pour mon WEPopover projet: (https://github.com/werner77/WEPopover):
@implementation UIBarButtonItem(WEPopover)
- (CGRect)frameInView:(UIView *)v {
UIView *theView = self.customView;
if (!theView.superview && [self respondsToSelector:@selector(view)]) {
theView = [self performSelector:@selector(view)];
}
UIView *parentView = theView.superview;
NSArray *subviews = parentView.subviews;
NSUInteger indexOfView = [subviews indexOfObject:theView];
NSUInteger subviewCount = subviews.count;
if (subviewCount > 0 && indexOfView != NSNotFound) {
UIView *button = [parentView.subviews objectAtIndex:indexOfView];
return [button convertRect:button.bounds toView:v];
} else {
return CGRectZero;
}
}
@end
J'ai été en mesure d'obtenir Werner Altewischer de WEpopover de travail en passant la barre d'outils avec le
UIBarButton:
Le Mod est en WEPopoverController.m
- (void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item toolBar:(UIToolbar *)toolBar
permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
animated:(BOOL)animated
{
self.currentUIControl = nil;
self.currentView = nil;
self.currentBarButtonItem = item;
self.currentArrowDirections = arrowDirections;
self.currentToolBar = toolBar;
UIView *v = [self keyView];
UIButton *button = nil;
for (UIView *subview in toolBar.subviews)
{
if ([[subview class].description isEqualToString:@"UIToolbarButton"])
{
for (id target in [(UIButton *)subview allTargets])
{
if (target == item)
{
button = (UIButton *)subview;
break;
}
}
if (button != nil) break;
}
}
CGRect rect = [button.superview convertRect:button.frame toView:v];
[self presentPopoverFromRect:rect inView:v permittedArrowDirections:arrowDirections animated:animated];
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.