2010-04-21 16 views
88

Chcę utworzyć obiekt UIBarButtonItem z niestandardowym obrazem, ale nie chcę obramowania dodawanego przez iPhone'a, ponieważ obraz ma specjalne obramowanie.UIBarButtonItem z niestandardowym obrazem i bez obramowania

Działa tak samo jak przycisk Wstecz, ale przycisk przewijania do przodu.

Ta aplikacja jest dla projektu na życzenie, więc nie obchodzi mnie, jeśli Apple odrzuca lub zatwierdza je lub lubi :-)

Jeśli używam initWithCustomView: własność V UIBarButtonItem, mogę to zrobić :

UIImage *image = [UIImage imageNamed:@"right.png"]; 

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
[button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal]; 
[button setBackgroundImage: [[UIImage imageNamed: @"right_clicked.png"] stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateHighlighted]; 

button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height); 

[button addTarget:self action:@selector(AcceptData) forControlEvents:UIControlEventTouchUpInside]; 

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height) ]; 

[v addSubview:button]; 

UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithCustomView:v]; 

self.navigationItem.rightBarButtonItem= forward; 

[v release]; 
[image release]; 

To działa, ale jeśli muszę powtórzyć ten proces w 10 widokach, nie jest to SUCHA.

Przypuszczam, że mam do podklasy, ale co?

  • NSView?
  • UIBarButtonItem?

Dzięki,

pozdrowienia,

+3

Dziękujemy za udostępnienie kodu, to wszystko co potrzebne :). – Max

+1

Wszyscy, użyłem odpowiedzi dostarczonej przez San 6 lutego. Zajęło mi to całe 5 minut, aby zintegrować się z moją Storyboard i działało idealnie. Właściwość Selector znajduje się w obszarze Inspektora połączeń IB. Steruj przeciąganiem z UIButton do obiektu ViewController, a metody wyskakują. Wybierz żądaną metodę i już prawie wszystko. Pozostało tylko oczyszczenie kodu. Użyto btnXXXXX.hidden, aby ukryć i odkryć, aby zastąpić barbuttonitem = nil. Ale ta metoda była łatwa i bardzo czysta. – user589642

Odpowiedz

44

można dodać metodę UIBarButtonItem bez instacji go przy użyciu niestandardowych kategorii:

@interface UIBarButtonItem(MyCategory) 

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action; 

@end 

@implementation UIBarButtonItem(MyCategory) 

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{ 
// Move your item creation code here 
} 
@end 

Więc nigdzie w kodzie można utworzyć pozycję bar nazywając ta metoda (pod warunkiem, że umieścisz nagłówek wraz z deklaracją).

P.S. Nie musisz używać funkcji "v" UIView, ponieważ można utworzyć przycisk UIBarButtonItem bezpośrednio za pomocą przycisku jako widoku niestandardowego.
P.P.S. Potrzebujesz również [wydania do przodu] w swoim kodzie.

+0

PS => tak, działa również, mniej kodu :-) – mongeta

+0

PPS => dzięki, teraz dodano – mongeta

+0

Kategoria niestandardowa: Muszę utworzyć plik nagłówkowy z tymi deklaracjami i plikiem implementacyjnym, w którym umieściłem kod, który polecasz? dzięki – mongeta

6

Alternatywą jest podklasa UIBarButtonItem. Czemu? Aby akcja została wywołana na celu przy pomocy właściwego nadawcy. W powyższym kodzie argumentem nadawcy komunikatu akcji jest instancja UIButton, a nie instancja UIBarButtonItem. Jest to ważne, na przykład, jeśli chcesz zaprezentować kontroler UIPopoverController z elementu przycisku paska. Poprzez podklasę UIBarButtonItem można dodać ivar, który zachowuje pierwotny cel, umożliwiając naszym instancjom podklasy przechwycenie, modyfikację i przekazanie komunikatu akcji właściwemu nadawcy.

Więc CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h> 

@interface CCFBarButtonItem : UIBarButtonItem 
{ 
@protected 
    id _originalTarget; 
} 
- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action; 
@end 

i CCFBarButtonItem.m

#import "CCFBarButtonItem.h" 
#import <UIKit/UIButton.h> 
#import <UIKit/UIView.h> 
#import <UIKit/UIImage.h> 

@implementation CCFBarButtonItem 

#pragma mark - Object life cycle 

- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action; 
{ 
    _ASSIGN(_originalTarget, target); 

    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [imgButton setImage:image forState:UIControlStateNormal]; 
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 
    [imgButton addTarget:self action:action forControlEvents:UIControlEventTouchUpInside]; 

    self = [super initWithCustomView:imgButton]; 

    return self; 
} 

- (void)dealloc; 
{ 
    MCRelease(_originalTarget); 
    [super dealloc]; 
} 

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector; 
{ 
    if([_originalTarget respondsToSelector:aSelector]) 
    { 
     return [_originalTarget methodSignatureForSelector:aSelector]; 
    } 
    else 
    { 
     return [super methodSignatureForSelector:aSelector]; 
    } 
} 

- (void)forwardInvocation:(NSInvocation *)anInvocation; 
{ 
    SEL aSelector = [anInvocation selector]; 
    if([_originalTarget respondsToSelector:aSelector]) 
    { 
     // modify the 'sender' argument so that it points to self 
     [anInvocation setArgument:&self atIndex:2]; 
     [anInvocation invokeWithTarget:_originalTarget]; 
    } 
    else 
    { 
     [self doesNotRecognizeSelector:aSelector]; 
    } 
} 
@end 
36

Znalazłem to w ten sposób łatwe. To jest sugerowane na górze. "random.png" musi znajdować się w projekcie. Po prostu przeciągnij i upuść dowolny obraz.

UIButton *a1 = [UIButton buttonWithType:UIButtonTypeCustom]; 
     [a1 setFrame:CGRectMake(0.0f, 0.0f, 25.0f, 25.0f)]; 
     [a1 addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside]; 
     [a1 setImage:[UIImage imageNamed:@"config.png"] forState:UIControlStateNormal]; 
     UIBarButtonItem *random = [[UIBarButtonItem alloc] initWithCustomView:a1]; 

//? line incomplete ?// imageNamed:@"random.png"] style:UIBarButtonItemStylePlain target:self action:@selector(randomMsg)]; 

    self.navigationItem.rightBarButtonItem = random; 
+1

dziękuje, działa! – offset

49

Innym prostym rozwiązaniem jest

  1. przeciągnąć standardowe UIButton
  2. Ustaw styl tego przycisku do zwyczaju i ustawić obraz tego przycisku
  3. przeciągnij ją na UINavigationBar Selector
  4. Set
+0

Prawdopodobnie najłatwiejsze rozwiązanie. Dzięki! – Prine

+0

@Prine Thanks :) – san

+1

Brilliant! Jedyne dziwactwo - nie zadziała, jeśli przeciągniesz przycisk prosto do paska nawigacji. Przycisk musi być ustawiony na niestandardowy, zanim zostanie dodany do paska nawigacji. Nie wiem dlaczego, ale tak właśnie jest. Zatem krok # 1 - oznacza przeciągnięcie UIBatton gdzieś w twoim interfejsie użytkownika innym niż pasek nawigacji. –

1

Ok, że c ategory działa bardzo dobrze, bo nie ma żadnych problemów z Popovercontroller :-)

#import <UIKit/UIKit.h> 

@interface UIBarButtonItem (BarButtonItemExtended) 
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action; 
-(void)performBarButtonAction:(id)sender; 
@end 



#import "UIBarButtonItem+BarButtonItemExtended.h" 

@implementation UIBarButtonItem (BarButtonItemExtended) 

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action 
{  
    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [imgButton setImage:image forState:UIControlStateNormal]; 
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height); 

    UIBarButtonItem *b = [[UIBarButtonItem alloc]initWithCustomView:imgButton]; 

    [imgButton addTarget:b action:@selector(performBarButtonAction:) forControlEvents:UIControlEventTouchUpInside]; 

    [b setAction:action]; 
    [b setTarget:target]; 

    return b; 
} 

-(void)performBarButtonAction:(UIButton*)sender 
{ 
    [[self target] performSelector:self.action withObject:self]; 
} 
@end 
3

Można to również zrobić programowo, jak również (z-oczywiście):

Najpierw należy utworzyć widok niestandardowy. Ten niestandardowy widok może zawierać obraz, przycisk lub cokolwiek innego. Zwyczaj widok można programowo lub IB:

UIImage *customImage = [UIImage imageNamed:@"imageName"]; 
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, customImage.size.width, customImage.size.height)]; 
customView.backgroundColor = [UIColor colorWithPatternImage:customImage]; 

Następnie należy utworzyć UIBarButtonItem i zainicjować go z widoku niestandardowego.

UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView]; 

Teraz wystarczy dodać niestandardową UIBarButton do leftBarButtonItem:

self.navigationItem.leftBarButtonItem = customBarButtonItem; 
0

Jeden inne rozwiązanie, że to prostsze w przypadku podczas tworzenia przycisku programowo:

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:defaultImage 
              landscapeImagePhone:landscapeImage 
                  style:UIBarButtonItemStylePlain 
                  target:self 
                  action:@selector(someSelector)]; 
[button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone]; 
1

Sprawdź to proste rozwiązanie.

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController 
{ 
barButtonItem.image = [UIImage imageNamed:@"navButton.png"]; 
barButtonItem.style = UIBarButtonItemStylePlain; 

[barButtonItem setBackgroundImage:[UIImage imageNamed:@"1x1.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES]; 
self.masterPopoverController = popoverController; 
} 

Tutaj 1x1.png to 1 piksel przezroczysty png obraz, który można pobrać z linku poniżej

http://commons.wikimedia.org/wiki/File:1x1.png

+0

Jedna linia rozwiązań kodu jest zdecydowanie dobra w mojej książce –

+0

Możesz użyć [UIImage new] zamiast używać przezroczystego obrazu. –

4
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"] 
                    style:UIBarButtonItemStylePlain 
                    target:self 
                    action:@selector(showMenu)]; 
Powiązane problemy