J'ai un Le Comment puis-je accéder au uibarbuttonitem code> avec
uibutton code> comme vue personnalisée. p>
uibutton code> a un
addTtarget: action: code> dessus. Dans l'action, je présente une colleure. Je présente actuellement à partir du
Sender.frame code> (la trame
uibutton code> s) que je veux présenter à partir du
uibarbuttonitem code> à la place. P >
uibarbuttonitem code> à partir du
uibutton code>? p>
5 Réponses :
Tout d'abord, pourquoi avez-vous besoin d'accéder au alors, pour créer un et l'utiliser comme ceci (première importation où le sélecteur est une méthode implémentée à l'intérieur de la classe (la cible) qui utilise ce bouton de barre. < / p> maintenant à l'intérieur du dossage une catégorie dans ce cas, il est utile de ne pas dupliquer le code . J'espère que cela aide. P> P.s. Je n'utilise pas d'arc, mais les mêmes considérations peuvent également être appliquées. P> EDIT: strong> p> Une solution facile pour accéder à l'élément de bouton de barre pourrait être le suivant : p> Peut-être que cela pourrait fonctionner, mais je préférerai le premier. P> p> uibarbuttonitem code>?
uibarbuttonitem code> avec une vue personnalisée, je vous suggère de créer une catégorie Extension Comme ci-dessous (dans ce cas, la vue personnalisée est un
uibutton code>). p>
Uibarbuttonitem + extension.h code>): p>
Dosomething: code> Sélecteur Vous pouvez le suivant: p>
UIBUTON CODE> LI>
uibarbuttonitem code> (un faible à éviter de retenir) li>
uibutton code> lorsque vous le créez. Li>
ol>
J'ai quelque chose de similaire à votre code, bien que j'ai fait une sous-classe d'uibarbuttonitem comme l'aspect et la sensation du bouton est assez personnalisée. Le problème est le `[Popover PresentPoppoverfrromrect: SenderButton.bounds Senview: Senderbutton ...]; ' Cela nécessite un peu de travail de positionnement de la population à la rotation, au clavier, etc. La pondéreuse peut être présentée d'un Uibarbuttonitem élimine tout cela et toujours des ancres à l'Uibarbuttonitem.
Je ne sais pas que vous avez besoin de l'UIBUTTON. Si ce que vous faites est d'envoyer une action, ou même personnaliser le bouton avec une image, le Si ce que vous êtes après est de saisir le cadre du juste une suggestion. P> Edit p> OK, je viens de lire le uipoppovercontroller référence (je n'ai jamais utilisé une). Je pense que ce que vous voulez, c'est En ce qui concerne votre mise en page personnalisée, je pense que si vous le répliquez dans un UIView et que vous faites la coutume BBI avec cela, vous ferez mieux. Ceci est bien sûr à vous de choisir. P> de toute façon, vous obtenez une référence à la BBI en le connectant comme une iboutlet avec votre NIB, ou en enregistrant une référence à ce que vous le créez dans le code. Ensuite, passez cette référence à la méthode Popover que j'ai décrite ci-dessus. Je pense que cela pourrait fonctionner pour vous. P> Moar P> Le BBI n'est qu'un membre de votre classe - un ivar avec une propriété de référence forte à ce sujet, peut-être relié à Iboutlet à votre nib. Ensuite, vous pouvez y accéder à partir de toute méthode que vous souhaitez dans la classe. P> Exemple: (Vous n'êtes pas sûr que j'ai le droit de gestion de la mémoire du contrôleur de popover) p> uibarbuttonitem code> devrait suffire.
UIBUTTON CODE> Pour réaliser la présentation, je pense que vous pourriez être mieux servi à estimer simplement la position du
uibarbuttonitem code>. Cela ne devrait pas être trop difficile, surtout si c'est l'un ou l'autre de votre
uinavigentitem code> 'S
de gauchebarbuttonitem code> ou
droitebarbuttonitem code>. P> < P> Je suis généralement pour le baiser (gardez-le simple, stupide!) Règle du pouce. Même Apple fait ceci ... Lorsque vous lancez une application à partir de Springboard, l'application se développe toujours du centre de l'écran et non de l'icône de l'application. P>
PresentPoppoverFrombarButtonitem: PermitearrowDirections: animée: code> et pour transmettre votre BBI comme premier paramètre. La raison pour laquelle la méthode existe consiste à résoudre votre problème - les BBI n'ont pas de cadre car ils ne sont pas sous-classes Nsview. Apple sait que vous voulez faire ce genre de chose et fournit cette méthode. En outre, je pense que si vous utilisez cette méthode, votre autorotation fonctionnera également. Je me trompe peut-être à ce sujet, donnez-lui un coup. P>
Le vrai problème est ma popover qui est présentée de l'action de l'Uibutton. Lorsque je fais pivoter l'écran, le pongeon n'est pas ancré à l'Uibarbuttonitem, son ancré au cadre de l'expéditeur de l'action, qui est l'Uibutton. J'avais besoin de l'UIBUTTON car mon uitoolbar est personnalisé, les boutons sont 84x48 sur le fond, 3 boutons, l'espace flexible, 4 boutons. L'UIBUTON me permet d'avoir le barbuttonitem avoir un graphique personnalisé et une étiquette dans des positions spécifiques dans le 84x48.
Étant donné que les porcovers présentés de Barbuttonitems n'ont pas le problème de positionnement, je pensais pouvoir faire une expéditeur.superview sur l'Uibutton et obtenir l'uibarbuttonitem. Au lieu de cela, je reçois l'uitoolbar. J'ai la position du bouton comme étiquette, puis-je simplement traverser l'uitoolbar pour l'uibarbuttonitem?
Désolé pour ça. Si vous présentez votre popover à l'aide de la méthode, j'ai indiqué ci-dessus, PresentPoppoverFrombarButtonItem: PermiteRrowDirections: Ani Mode: Code>, la Popover sera automatiquement repositionnée, le cas échéant pendant les changements d'orientation du périphérique.
Exactement! Comment puis-je avoir accès à l'uibarbuttonitem? Le barbouttonitem que j'ai est introduit avec CusomView, qui est un Uibutton. L'Uibutton a l'addTtarget dessus. Donc, lorsque vous appuyez sur le bouton, c'est l'expéditeur à l'action. Une fois dans l'action, j'aimerais avoir accès à l'Uibarbuttonitem. La seule façon dont je suis arrivé est de sous-classer l'UIBUTTON, ajoutez un ivar pour l'uibarbuttonitem, et définissez-le lorsque j'y introche le bouton.
Désolé, je n'ai pas réalisé tout votre édition. Je devrai voir d'utiliser un UIView ou UiImageView comme point de vue personnalisé contre l'UIBUTTON. J'ai juste aimé l'Uibutton comme il nuque les images avec des points forts, sélectionnés, normaux, désactivés. Toutes lesquelles j'utilise une couleur différente pour représenter l'état. J'ai également ajouté un Uilabel comme une sous-vision de l'Uibutton pour un placement différent du texte du titre. Ce texte diminue également lorsqu'il est désactivé.
J'ai ajouté les choses sous Moar juste maintenant. Si vous utilisez l'UIBUTTON, vous devriez toujours pouvoir conserver une référence à la BBI lorsque vous le créez.
J'aurais besoin du uibarbuttonitem code> lié au
uibutton code> comme je l'ai, pour le moment, 7
uibarbuttonitem code> s
Si vous avez défini votre Voici mon code complètement non testé pour le faire. Vous appelleriez uibutton code> comme
CustomVoir code> d'un
uibarbuttonitem code> ou un enfant de la vue personnalisée, vous pouvez alors marcher La hiérarchie de vue de votre bouton jusqu'à trouver le
uitoolbar code> ou
uinavigationbar code> contenant le bouton, puis recherchez les éléments de la barre pour celui dont la vue personnalisée est le bouton (ou un ancêtre du bouton).
[[auto classe] Barbuttonitemforview: mybutton] code> pour obtenir l'élément contenant votre bouton. P>
+ (BOOL)ifBarButtonItem:(UIBarButtonItem *)item containsView:(UIView *)view storeItem:(UIBarButtonItem **)outItem {
UIView *customView = item.customView;
if (customView && [view isDescendantOfView:customView]) {
*outItem = item;
return YES;
} else {
return NO;
}
}
+ (BOOL)searchBarButtonItems:(NSArray *)items forView:(UIView *)view storeItem:(UIBarButtonItem **)outItem {
for (UIBarButtonItem *item in items) {
if ([self ifBarButtonItem:item containsView:view storeItem:outItem])
return YES;
}
return NO;
}
+ (UIBarButtonItem *)barButtonItemForView:(UIView *)view {
id bar = view;
while (bar && !([bar isKindOfClass:[UIToolbar class]] || [bar isKindOfClass:[UINavigationBar class]])) {
bar = [bar superview];
}
if (!bar)
return nil;
UIBarButtonItem *item = nil;
if ([bar isKindOfClass:[UIToolbar class]]) {
[self searchBarButtonItems:[bar items] forView:view storeItem:&item];
}
else {
UINavigationItem *navItem = [bar topItem];
if (!navItem)
return nil;
[self ifBarButtonItem:navItem.backBarButtonItem containsView:view storeItem:&item]
|| [self ifBarButtonItem:navItem.leftBarButtonItem containsView:view storeItem:&item]
|| [self ifBarButtonItem:navItem.rightBarButtonItem containsView:view storeItem:&item]
|| ([navItem respondsToSelector:@selector(leftBarButtonItems)]
&& [self searchBarButtonItems:[(id)navItem leftBarButtonItems] forView:view storeItem:&item])
|| ([navItem respondsToSelector:@selector(rightBarButtonItems)]
&& [self searchBarButtonItems:[(id)navItem rightBarButtonItems] forView:view storeItem:&item]);
}
return item;
}
Tu es l'homme! Je n'ai pas été en mesure de tester les navigations comme j'utilise un uitoolbar. Cela fonctionne très bien! Merci!
Disons que vous avez ajouté l'Uibutton Abutton à uibarbuttonitem Info_button comme suit:
- (IBAction)showInfo:(id)sender { [self.flipsidePopoverController presentPopoverFromBarButtonItem:info_Button permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }
// get the UIBarButtonItem from the UIButton that is passed in sender UIToolbar *toolbar = (id)[sender superview]; UIBarButtonItem *ourButtonItem = [toolbar items][2];//pick the right index [parkingPopOver_ presentPopoverFromBarButtonItem:ourButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];