首页 文章

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

提问于
浏览
88

我想用自定义图像创建一个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];

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

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

  • NSView?

  • UIBarButtonItem?

谢谢,

问候,

9 回答

  • 50

    您可以向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
    

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

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

  • 4

    另一个简单的解决方案

    • 拖动标准UIButton

    • 将按钮的样式设置为自定义,并为该按钮设置图像

    • 将其拖到UINavigationBar上

    • 设置选择器

  • 6

    我觉得这很简单 . 它被消化在上面 . “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;
    
  • 44

    另一种方法是子类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
    

    和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
    
  • 1
    UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"]
                                                                        style:UIBarButtonItemStylePlain
                                                                       target:self
                                                                       action:@selector(showMenu)];
    
  • 3

    这也可以通过编程方式完成(当然):

    首先,创建一个自定义视图 . 此自定义视图可以包含图像,按钮或您想要的任何其他内容 . 自定义视图可以通过编程方式或在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;
    
  • 0

    好吧,这个类别非常好,因为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
    
  • 1

    检查这个简单的解决方案 .

    - (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是1像素透明png图像,您可以从下面的链接下载

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

  • 37

    另一个解决方案,认为以编程方式创建按钮时更简单:

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

相关问题