UIBarButtonItem具有自定义图像,没有边框

mon*_*eta 88 iphone uibarbuttonitem ios

我想用自定义图像创建一个UIBarButtonItem,但我不想要iPhone添加的边框,因为我的图像有一个特殊的边框.

它与后退按钮相同,但是前进按钮.

这个应用程序是针对inHouse项目的,所以我不在乎Apple是拒绝或批准它还是喜欢它:-)

如果我使用UIBarButtonItem的initWithCustomView:v属性,我可以这样做:

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];
Run Code Online (Sandbox Code Playgroud)

这有效,但如果我必须在10个视图中重复此过程,这不是DRY.

我想我必须继承,但是什么?

  • NSView?
  • UIBarButtonItem?

谢谢,

问候,

san*_*san 50

另一个简单的解决方案

  1. 拖动标准UIButton
  2. 将按钮的样式设置为自定义,并为该按钮设置图像
  3. 将其拖到UINavigationBar上
  4. 设置选择器


Vla*_*mir 44

您可以向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
Run Code Online (Sandbox Code Playgroud)

因此,您可以在代码中的任何位置创建调用此方法的条形项(前提是您在其声明中包含标题).

PS您不需要使用'v'UIView,因为您可以UIBarButtonItem使用按钮直接创建自定义视图.
PPS您还需要在代码中使用[正向发布].

  • BTW-我把它添加到我的UIKit便利类别的小开源仓库中.感谢@Vladimir的灵感.(注意我所有的东西都是基于ARC的)https://github.com/egold/UIKitConvenience/blob/master/UIKitConvenience/UIBarButtonItem%2BImageItem.h (2认同)

m-f*_*han 37

我觉得这很简单.它被消化在上面."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;
Run Code Online (Sandbox Code Playgroud)


Flu*_*imp 6

另一种方法是子类UIBarButtonItem.为什么?这样就可以使用正确的发件人在目标上调用该操作.在上面的代码中,操作消息中的sender参数是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
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)


ale*_*hun 5

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