Özel görüntüye sahip ve kenarlıksız UIBarButtonItem


89

Özel bir görüntüye sahip bir UIBarButtonItem oluşturmak istiyorum, ancak Görüntümün özel bir kenarlığı olduğundan iPhone'un eklediği kenarlığı istemiyorum.

Geri düğmesiyle aynı, ancak bir ileri düğmesi.

Bu Uygulama bir inHouse projesi içindir, bu yüzden Apple'ın bunu reddetmesi, onaylaması veya beğenmesi umurumda değil :-)

UIBarButtonItem öğesinin initWithCustomView: v özelliğini kullanırsam, bunu yapabilirim:

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

Bu işe yarıyor, ancak bu işlemi 10 görüntülemede tekrar etmem gerekirse, bu KURU değil.

Sanırım alt sınıfa girmem gerekiyor, ama ne?

  • NSView?
  • UIBarButtonItem?

Teşekkürler,

Saygılarımızla,


3
Kodunuzu paylaştığınız için teşekkürler, tek ihtiyacım olan buydu :).
Maksimum

1
Millet, San'ın 6 Şubat'ta verdiği cevabı kullandım. Storyboard'uma entegre olmak 5 dakikanın tamamını aldı ve mükemmel çalıştı. Selector özelliği IB'nin Bağlantı Denetçisi altındadır. UIButton'dan ViewController nesnesine kontrol sürükleyin ve yöntemler açılır. İstediğiniz yönteme dokunun ve hemen hemen bitirdiniz. Geriye kalan tek şey biraz kod temizliği olacaktır. Barbuttonitem = nil yerine gizlemek ve göstermek için btnXXXXX.hidden kullanıldı. Ancak bu yöntem kolay ve çok temizdi.
user589642

Yanıtlar:


44

Özel kategori kullanarak alt sınıflara ayırmadan UIBarButtonItem'e bir yöntem ekleyebilirsiniz:

@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

Böylece, kodunuzun herhangi bir yerinde bu yöntemi çağıran bir bar öğesi oluşturabilirsiniz (bildirimiyle birlikte bir başlık eklemeniz koşuluyla).

Not: UIBarButtonItemDoğrudan özel görünüm olarak bir düğme ile oluşturabileceğiniz için 'v' UIView kullanmanıza gerek yoktur .
PPS Ayrıca kodunuzda [ileri sürüm] 'e ihtiyacınız var.


Özel kategori: Bu bildirimlerle başlık dosyasını ve başvuruda bulunduğunuz kodu nereye koyacağım uygulama dosyasını oluşturmalıyım? teşekkürler
mongeta

Çok fazla çalışıyor ama seçici yazamıyorum, kategoriye seçici yazmak istemiyorum
sınıfıma

@NileshTupe ne demek istiyorsun? Seçici yöntemi ve hedefi geçersiniz - böylece hedef istediğiniz her nesne olabilir
Vladimir

2
BTW- Bunu UIKit uygunluk kategorileri için küçük açık kaynak depoma ekledim. İlham için teşekkürler @ Vladimir. (tüm öğelerimin ARC tabanlı olduğunu unutmayın) github.com/egold/UIKitConvenience/blob/master/UIKitConvenience/…
Eric Goldberg

50

Başka bir basit çözüm ise

  1. Standart bir UIB düğmesini sürükleyin
  2. Düğmenin stilini özel olarak ayarlayın ve bu düğme için görüntünüzü ayarlayın
  3. UINavigationBar üzerine sürükleyin
  4. Seçiciyi Ayarla

1
Muhtemelen en kolay çözüm. Teşekkürler!
Prine

1
Parlak! Tek tuhaflık - düğmeyi doğrudan gezinme çubuğuna sürüklerseniz işe yaramaz. Gezinti çubuğuna eklenmeden önce düğmenin özel olarak ayarlanması gerekir. Neden olduğundan emin değilim, ama bu böyle. Yani 1. adım - UIBatton'u kullanıcı arayüzünüzde gezinme çubuğu dışında bir yere sürüklemek anlamına gelir.
Andrei Tchijov

1
basit ve etkili olması zordur. Güzel cevap
Add080bbA

37

Bu şekilde kolay buldum. Üstte tatbik edilir. "random.png" projede olmalıdır. Sadece herhangi bir resmi sürükleyip bırakın.

 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;

6

Bir alternatif, UIBarButtonItem alt sınıfına girmektir. Neden? Böylece eylem, doğru gönderici ile hedefte çağrılır. Yukarıdaki kodda, eylem mesajındaki gönderen bağımsız değişkeni UIBarButtonItem örneği değil, UIButton örneğidir. Bu, örneğin, çubuk düğmesi öğesinden bir UIPopoverController sunmak istiyorsanız önemli olacaktır. UIBarButtonItem'i alt sınıflara ayırarak, orijinal hedefi tutan bir ivar ekleyebilir, alt sınıf örneklerimizin eylem mesajını uygun gönderici ile kesmesine, değiştirmesine ve iletmesine izin verebilirsiniz.

Yani, CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h>

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

ve 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

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

3

Bu aynı zamanda programlı olarak da yapılabilir (elbette):

İlk önce özel bir görünüm oluşturun. Bu özel görünüm, bir resim, düğme veya istediğiniz başka bir şeyi içerebilir. Özel görünüm programlı olarak veya IB'de yapılabilir:

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

Ardından, bir UIBarButtonItem oluşturun ve bunu özel görünümle başlatın.

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

Şimdi, özel UIBarButton'ı leftBarButtonItem'e ekleyin:

self.navigationItem.leftBarButtonItem = customBarButtonItem;

1

Tamam, bu kategori çok iyi çalışıyor çünkü Popovercontroller ile sorun yok :-)

#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

1

Bu basit çözüme bir göz atın.

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

Burada 1x1.png, aşağıdaki linkten indirebileceğiniz 1 piksel şeffaf bir png görselidir.

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


Saydam görüntü yerine [UIImage new] kullanabilirsiniz.
James Campbell

0

Başka bir çözüm, programlı olarak düğme oluştururken daha basit olduğunu düşünün:

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];
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.