2013-01-10 11 views
7

Próbuję ustawić niestandardowy obraz wciśnięty dla mojego UIBarButtonItem, ale nic nie działa. Z mojego rozumowania poniższy kod powinien zadziałać, ale pomimo ustawienia obrazu podświetlonego stanu, przycisk wygląda dokładnie tak samo po naciśnięciu.Niestandardowe "wciśnięty" UIBarButtonItem Tła

Wszelkie pomysły?

UIImage *barButtonBackground = [[UIImage imageNamed:ANBarButtonItemBackgroundImageName] resizableImageWithCapInsets:UIEdgeInsetsMake(5.0f,5.0f, 5.0f, 5.0f)]; 
UIImage *barButtonPressedBackground = [[UIImage imageNamed:ANBarButtonPressedImageName] resizableImageWithCapInsets:UIEdgeInsetsMake(5.0f,5.0f, 5.0f, 5.0f)]; 

[self.navigationItem.leftBarButtonItem setBackgroundImage:barButtonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 
[self.navigationItem.rightBarButtonItem setBackgroundImage:barButtonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; 

[self.navigationItem.leftBarButtonItem setBackgroundImage:barButtonPressedBackground forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
[self.navigationItem.rightBarButtonItem setBackgroundImage:barButtonPressedBackground forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; 
+0

Jak ty tworzenia przycisków? Który obraz rzeczywiście widzisz? – foundry

+0

Czy jesteś pewien, że naciśnięty obraz jest rzeczywiście inny? Spróbuj zamienić obrazy. –

+0

Sprawdziłem oba obrazy - są różne. Przyciski są tworzone w mojej Storyboard. IBActions, icons i sofourth wszystko działa na elementach paska przycisków-- Po prostu nie mogę uzyskać alternatywnego obrazu, aby pojawił się dla tych BarButtonItems, gdy jest podświetlony. – arooo

Odpowiedz

23

myślę, że należy stworzyć custom UIButton z obrazy tła dla różnych stanów regulacyjnych pasujących do Twojego schematu kolorów, a następnie użyć tej UIButton jak widok dla custom UIBarButtonItem.

UIButton *customButton = [UIButton buttonWithType:...]; 

[customButton setBackgroundImage:barButtonBackground forState:UIControlStateNormal]; 
[customButton setBackgroundImage:barButtonPressedBackground forState:UIControlStateSelected]; 

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView: customButton]; 

Jeśli chcesz jakiś inny referencyjny następnie można przejść przez ten piękny linkiem: Using Appearance Proxy to Style Apps

+1

Naprawdę miałem nadzieję, że był prosty sposób, aby to zrobić z rzeczywistymi UIBarButtonItems, ale wygląda to jak najlepszy sposób, aby przejść, które mogę znaleźć. Dzięki. – arooo

+0

To powinno działać, ale co zrobić, jeśli chcemy ustawić różne obrazy dla różnych stanów (nie obrazów tła)? metoda setImage na UIBarButtonItem nie wydaje się mieć metodę forState ... Potrzebuję zmienić obraz, a nie tylko tło. Wszelkie pomysły na ten temat? – Stan

+0

To samo pytanie co stan ?? – user1010819

3

prawdopodobnie można spróbować w ten sposób. Pracuje dla mnie.

UIImage* image3 = [UIImage imageNamed:@"mail-48_24.png"]; 
CGRect frameimg = CGRectMake(0, 0, image3.size.width, image3.size.height); 
UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
[someButton setBackgroundImage:image3 forState:UIControlStateNormal]; 
[someButton addTarget:self action:@selector(sendmail) 
    forControlEvents:UIControlEventTouchUpInside]; 
[someButton setShowsTouchWhenHighlighted:YES]; 

UIBarButtonItem *mailbutton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
self.navigationItem.rightBarButtonItem=mailbutton; 
[someButton release]; 
2

Może to pomoże (tylko dodać, że pliki w projekcie):

UIBarButtonItem + customLook.h

#import <UIKit/UIKit.h> 

@interface UIBarButtonItem (customLook) 

+ (UIBarButtonItem *)barButtonItemWithImage:(UIImage *)image selectedBackGroundImage:(UIImage *)selected target:(id)target action:(SEL)selector; 

@end 

UIBarButtonItem + customLook.m

#import "UIBarButtonItem+customLook.h" 

@implementation UIBarButtonItem (customLook) 

+ (UIBarButtonItem *)barButtonItemWithImage:(UIImage *)image selectedBackGroundImage:(UIImage *)selected target:(id)target action:(SEL)selector 
{ 
    UIButton* someButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    [someButton setImage:image forState:UIControlStateNormal]; 
    [someButton setBackgroundImage:selected forState:UIControlStateSelected]; 

    CGSize size = image.size; 
    CGRect frame = CGRectZero; 
    frame.size.width = size.width; 
    frame.size.height = 30.0f; // Standart height 
    someButton.frame = frame; 

    [someButton addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem* backButton = [[UIBarButtonItem alloc] initWithCustomView:someButton]; 

    return backButton; 
} 

@end 

Niektóre kontroler widoku:

#import "UIBarButtonItem+customLook.h" 
... 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIBarButtonItem *bbi = [UIBarButtonItem barButtonItemWithImage:[UIImage imageNamed:@"29-heart-selected.png"] 
              selectedBackGroundImage:[UIImage imageNamed:@"DarkButton_Pressed.png"] 
                  target:self 
                  action:@selector(someAction:)]; 
    self.navigationItem.rightBarButtonItem = bbi; 
} 

...

- (void)someAction:(id)sender 
{ 
    [(UIButton *)sender setSelected:YES]; 
} 
1
UIImage* btnImage = [UIImage imageNamed:@"share-icon-deselected-16x16.png"]; 
    CGRect frameimg = CGRectMake(0, 0, btnImage.size.width, btnImage.size.height); 
    UIButton *someButton = [[UIButton alloc] initWithFrame:frameimg]; 
    [someButton setBackgroundImage:btnImage forState:UIControlStateNormal]; 
    [someButton addTarget:self action:@selector(share:) 
     forControlEvents:UIControlEventTouchUpInside]; 
    [someButton setShowsTouchWhenHighlighted:YES]; 

    UIBarButtonItem *mailbutton =[[UIBarButtonItem alloc] initWithCustomView:someButton]; 
    self.navigationItem.rightBarButtonItem=mailbutton; 




- (void)share:(id)sender{ 
    UIButton*btn = (UIButton*)sender; 
    if (btn.isSelected) 
    { 
     [btn setSelected:NO]; 
     [btn setBackgroundImage:[UIImage imageNamed:@"share-icon-deselected-16x16.png"] forState:UIControlStateNormal]; 
    } 
    else 
    { 
     [btn setSelected:YES]; 
     [btn setBackgroundImage:[UIImage imageNamed:@"share-icon-selected-16x16.png"] forState:UIControlStateNormal]; 
    } 
}; 
+1

Podoba mi się Twoja sugestia, aby użyć szerokości i wysokości obrazu. Ale pozwól mi przedstawić kilka sugestii. Po ustawieniu przycisku ustaw obraz dla wybranego stanu za pomocą linii [someButton setBackgroundImage: selectedImage forState: UIControlStateSelected]; . W metodzie udostępniania użyj UIButton jako typu parametru i przełącz za pomocą następującej linii: button.selected =! Button.selected; Dbać. – smileBot

+0

Tak, to prawda :) Dzięki za Twoją sugestię @ cocoanut. – Abo3atef