【问题标题】:What is the correct way to draw a custom UIBarButtonItem?绘制自定义 UIBarButtonItem 的正确方法是什么?
【发布时间】:2011-10-25 20:12:12
【问题描述】:

我正在编写自定义 UINavigationBar。由于该应用程序应该在 iOS 4 上运行,因此无法使用 new customization options available on iOS 5

也就是说,我对 UINavigationBar 进行了子类化,以避免使用效果很好的类别,如下图所示。

UIBarButtonItems 不能正常工作。

我尝试继承 UIBarButtonItem 类并覆盖 drawRect 方法,但没有任何改变。

CustomUIBarButtonItem *backButton = [[CustomUIBarButtonItem alloc] initWithTitle:@"Notícias" style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

然后我也尝试设置下面的图像,但也没有用。

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"noticias_back.png"] style:UIBarButtonItemStyleBordered target:nil action:nil];
self.navigationItem.backBarButtonItem = backButton;
[backButton release];

那么,我该怎么做呢?

【问题讨论】:

标签: iphone cocoa-touch ios4


【解决方案1】:

我只是做一些类似...

UIButton *searchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[searchButton setBackgroundImage:[UIImage imageNamed:@"search"] forState:UIControlStateNormal];
[searchButton setBackgroundImage:[UIImage imageNamed:@"search_pressed"] forState:UIControlStateHighlighted];
[searchButton addTarget:self action:@selector(selectedSearch) forControlEvents:UIControlEventTouchUpInside];
[searchButton setImage:[UIImage imageNamed:@"search"] forState:UIControlStateNormal];
[searchButton sizeToFit];

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:searchButton];

【讨论】:

    【解决方案2】:

    您必须在按下或模态显示之前设置自定义按钮。例如:

    ENPurchaseEditView *purchaseView = [[ENPurchaseEditView alloc] initWithNibName:@"ENPurchaseEditView" bundle:nil];
    
    // customized left button to cancel - not back.
    ENBarButtonImageItem *cancelBtn = 
    [[ENBarButtonImageItem alloc] initWithFrame:CGRectMake(0, 0, 29, 29)
                                          image:[UIImage imageNamed:@"btn_cancel.png"]
                                backgroundImage:nil 
                                         target:purchaseView 
                                         action:@selector(cancel:)];   
    
    // setLeftBarButtonItem before you push or present.
    // in this view, I also setHidesBackButton = YES in the init so my custom left
    // shows up.
    [[purchaseView navigationItem] setLeftBarButtonItem:cancelBtn];
    [cancelBtn release];    
    
    // Edit purchase in full modal view.
    // This could be a push - in my case I'm presenting a navController.
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:purchaseView];
    [[self navigationController] presentModalViewController:navController animated:YES];
    

    在我的例子中,ENBarButtonImageItem 是一个自定义 UIBarButtonItem。这是我的课:

    #import "ENBarButtonImageItem.h"
    
    @implementation ENBarButtonImageItem
    
    - (id)initWithFrame:(CGRect)frame 
                  image:(UIImage*)image 
        backgroundImage:(UIImage*)bgImage
    {
        _button = [UIButton buttonWithType:UIButtonTypeCustom];
        [_button setFrame:frame];
    
        self = [super initWithCustomView:_button];
        if (self) 
        {
            if (image)
                [_button setImage:image forState:UIControlStateNormal];
    
            if (bgImage)
                [_button setBackgroundImage:bgImage forState:UIControlStateNormal];
    
        }
        return self;    
    }
    
    - (id)initWithFrame:(CGRect)frame 
                  image:(UIImage*)image 
        backgroundImage:(UIImage*)bgImage 
                 target:(id)target 
                 action:(SEL)selector
    {
        self = [self initWithFrame:frame image:image backgroundImage:bgImage];
        if (self)
        {
            [_button addTarget:target action:selector forControlEvents:UIControlEventTouchUpInside];
        }
    
        return self;
    }
    
    - (void)dealloc
    {
        [super dealloc];
        [_button release];
    }
    
    - (void)addTarget:(id)target action:(SEL)selector forControlEvents:(UIControlEvents)controlEvents
    {
        [_button addTarget:target action:selector forControlEvents:controlEvents];
    }
    
    - (void)setImage:(UIImage *)image forState:(UIControlState)state
    {
        [_button setImage:image forState:state];
    }
    
    - (void)setBackgroundImage:(UIImage *)image forState:(UIControlState)state
    {
        [_button setImage:image forState:state];
    }
    
    @end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      相关资源
      最近更新 更多