65 votes

Figure UIBarButtonItem cadre de la fenêtre?

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?

126voto

KennyTM Points 232647

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.

18voto

Carlos Guzman Points 121

Je n'ai pas vu cette option posté (qui à mon avis est beaucoup plus simple), il est donc ici:

UIView *barButtonView = [barButtonItem valueForKey:@"view"];

8voto

Jeremy Fuller Points 2174

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

4voto

Werner Altewischer Points 3439

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

2voto

Jim Malak Points 21

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.com

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.

Powered by:

X