Chcę utworzyć UIBarButtonItem z niestandardowym obrazem, ale nie chcę obramowania dodawanego przez iPhone'a, ponieważ mój obraz ma specjalną ramkę.
Jest taki sam jak przycisk Wstecz, ale przycisk Dalej.
Ta aplikacja jest przeznaczona do projektu inHouse, więc nie obchodzi mnie, czy Apple ją odrzuci, zatwierdzi lub polubi :-)
Jeśli używam właściwości initWithCustomView: 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, to nie jest SUCHA.
Przypuszczam, że muszę podklasę, ale co?
- NSView?
- UIBarButtonItem?
dzięki,
pozdrowienia,
ios
iphone
uibarbuttonitem
mongeta
źródło
źródło
Odpowiedzi:
Możesz dodać metodę do UIBarButtonItem bez tworzenia podklas przy użyciu kategorii niestandardowej:
@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
Tak więc w dowolnym miejscu kodu możesz utworzyć element paska wywołujący tę metodę (pod warunkiem, że dołączysz nagłówek do jego deklaracji).
PS Nie musisz używać „v” UIView, ponieważ możesz utworzyć bezpośrednio
UIBarButtonItem
za pomocą przycisku widok niestandardowy.PPS Potrzebujesz również [forward release] w swoim kodzie.
źródło
Innym prostym rozwiązaniem jest
źródło
To było dla mnie łatwe. Jest zasugerowany na wierzchu. „random.png” musi być 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;
źródło
Alternatywą jest podklasa UIBarButtonItem. Czemu? Aby akcja została wywołana na celu z odpowiednim nadawcą. W powyższym kodzie argument nadawcy w komunikacie dotyczącym akcji to instancja UIButton, a nie instancja UIBarButtonItem. Byłoby to ważne, na przykład, jeśli chcesz przedstawić kontroler UIPopoverController z elementu przycisku paska. Podklasując UIBarButtonItem, możesz dodać ivar, który zachowuje oryginalny cel, umożliwiając naszym instancjom podklasy przechwytywanie, modyfikowanie i przekazywanie komunikatu akcji z odpowiednim nadawcą.
Tak 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
źródło
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"] style:UIBarButtonItemStylePlain target:self action:@selector(showMenu)];
źródło
Można to również zrobić programowo (oczywiście):
Najpierw utwórz widok niestandardowy. Ten niestandardowy widok może zawierać obraz, przycisk lub cokolwiek innego, co chcesz. Widok niestandardowy można wykonać programowo lub w 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 utwórz UIBarButtonItem i zainicjuj go za pomocą widoku niestandardowego.
UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView];
Teraz po prostu dodaj niestandardowy UIBarButton do leftBarButtonItem:
self.navigationItem.leftBarButtonItem = customBarButtonItem;
źródło
Ok, ta kategoria działa bardzo dobrze, ponieważ nie ma problemów z kontrolerem Popover :-)
#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
źródło
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 jest 1-pikselowym przezroczystym obrazem png, który można pobrać z linku poniżej
http://commons.wikimedia.org/wiki/File:1x1.png
źródło
Jeszcze jedno rozwiązanie, myślę, że jest prostsze w przypadku 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];
źródło