UIBarButtonItem с пользовательским изображением и без границ

Я хочу создать UIBarButtonItem с пользовательским изображением, но я не хочу, чтобы iPhone добавлял границу, так как у моего изображения есть специальная рамка.

Это то же самое, что и кнопка "Назад", но кнопка "вперед".

Это приложение предназначено для проекта inHouse, поэтому мне все равно, если Apple отклонит или одобрит его или понравится: -)

Если я использую свойство initWithCustomView: v для UIBarButtonItem, я могу это сделать:

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

Это работает, но если мне нужно повторить этот процесс в 10 представлениях, это не СУХОЙ.

Я полагаю, что я должен подкласс, но что?

  • NSView?
  • UIBarButtonItem?

спасибо,

С уважением,

Ответ 1

Вы можете добавить метод в UIBarButtonItem без подклассификации его с помощью настраиваемой категории:

@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

Поэтому в любом месте вашего кода вы можете создать элемент бара, вызывающий этот метод (при условии, что вы включаете заголовок с его объявлением).

P.S. Вам не нужно использовать 'v' UIView, поскольку вы можете создать UIBarButtonItem с помощью кнопки в качестве пользовательского представления напрямую.
P.P.S. Вам также необходимо [форвардная версия] в вашем коде.

Ответ 2

Другим простым решением является

  • Перетащите стандартную UIButton
  • Установите стиль кнопки в пользовательский режим и установите для этой кнопки изображение
  • Перетащите его на UINavigationBar
  • Установить селектор

Ответ 3

Я нашел это легко. Он взвинчен сверху. "random.png" должен быть в проекте. Просто перетащите любое изображение.

 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;

Ответ 4

Альтернативой является подкласс UIBarButtonItem. Зачем? Чтобы действие вызывалось с целью с правильным отправителем. В приведенном выше коде аргумент отправителя в сообщении о действии является экземпляром UIButton, а не экземпляром UIBarButtonItem. Это было бы важно, например, если вы хотите представить UIPopoverController из элемента кнопки панели. Подклассифицируя UIBarButtonItem, вы можете добавить ivar, который сохраняет исходную цель, позволяя нашим экземплярам подкласса перехватывать, изменять и пересылать сообщение с соответствующим отправителем.

Итак, CCFBarButtonItem.h:

#import <uIKit/UIBarButtonItem.h>

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

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

Ответ 6

Это также можно сделать программно (конечно):

Сначала создайте собственное представление. Это настраиваемое представление может содержать изображение, кнопку или все, что вам нужно. Пользовательский вид может быть сделан программно или в 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];

Затем создайте UIBarButtonItem и инициализируйте его с помощью настраиваемого представления.

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

Теперь добавьте пользовательский UIBarButton к элементу leftBarButtonItem:

self.navigationItem.leftBarButtonItem = customBarButtonItem;

Ответ 7

Хорошо, что эта категория работает очень хорошо, потому что нет проблем с 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

Ответ 8

Проверьте это простое решение.

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

Здесь 1x1.png представляет собой прозрачное png-изображение размером 1 пиксель, которое вы можете скачать по ссылке ниже

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

Ответ 9

Еще одно решение, подумайте, что проще при создании кнопки программно:

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