UIBarButtonItem,第一个视图后没有显示自定义视图

时间:2011-09-01 03:50:14

标签: iphone objective-c ios cocoa-touch uikit

好的,这是一个奇怪的。我现在一直在抨击它,试图调试一小时。

我创建了一个带有自定义视图的UIBarButtonItem,它是一个分配了图像的UIButton。代码如下

UIButton *btnAdd = [[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 28, 28)] autorelease];

[btnAdd setImage:[UIImage imageNamed:@"btn_add"] forState:UIControlStateNormal];

[btnAdd addTarget:self
           action:@selector(addBox)
 forControlEvents:UIControlEventTouchUpInside];

UIBarButtonItem *add = [[UIBarButtonItem alloc] initWithCustomView:btnAdd];

self.navigationItem.rightBarButtonItem = add;

它位于扩展UIViewController

上的- (id)initWithNibName:方法中

在UIViewController的第一次出现时,按钮显示为正常,并且工作正常。但是,如果我推送到另一个视图控制器,然后回击,按钮是不可见的。

即使它不可见,按钮仍然有效。我可以点击它,它表现正常。我知道它是原来的UIButton,因为我已经对其内存地址和其他属性做了跟踪...它的隐藏属性为FALSE,其alpha属性设置为1.00f

我一开始认为这可能是一个深度问题,但我在每个帧循环中都将代码推送到自定义UINavigationBar背景,并且没有任何变化。 SEE UPDATE

这几乎就像是影像正在发布或幕后的东西,但指针上的指针也很好......

我猜这是一个奇怪的绘画怪癖,我只需要随意逛逛,但这对谷歌来说是一个非常难的问题。

任何提示都将不胜感激。

更新

事实证明这是一个深度问题。我正在drawRect:上绘制一个自定义背景,并且该代码将自定义背景推送到视图堆栈的后面,但是,此方法仅由私有框架方法调用一次...因此当重绘条形图之后第一个视图,背景没有被强制退回,出于某种愚蠢的原因,它决定重绘它背后的按钮。

所以现在我想弄清楚每次渲染UINavigationBar时如何强制背景被推回。

6 个答案:

答案 0 :(得分:2)

尝试像这样的工作很好地和我一起

    UIImage *image = [UIImage imageNamed:@"btn_set-as-fea.png"];
    UIImage *hilghtedImage=[UIImage imageNamed:@"btn_set-as-fea_h.png"];
    CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);

    UIButton* someButton = [[UIButton alloc] initWithFrame:frame];
    [someButton addTarget:self action:@selector(SetAsFeatured) forControlEvents:UIControlEventTouchUpInside];
    [someButton setBackgroundImage:image forState:UIControlStateNormal];
    [someButton setBackgroundImage:hilghtedImage forState:UIControlStateHighlighted];
    [someButton setShowsTouchWhenHighlighted:YES];
   setAsFeatured = [[UIBarButtonItem alloc] initWithCustomView:someButton];

答案 1 :(得分:0)

很久以前,我已经陷入同样的​​痛苦之中。我实施了以下,永久的解决方案,并且工作得很完美......

btnAdd 是一个UIButton,您可以通过设置其x和y来设置所需的位置。

    - (void)viewDidLoad 
    {
        btnAdd = [UIButton buttonWithType:UIButtonTypeCustom];
        btnAdd.frame = CGRectMake(250, 6, 61, 30);
        [btnAdd setImage:[UIImage imageNamed:@"btnAdd.png"] forState:UIControlStateNormal];
        btnAdd.backgroundColor = [UIColor clearColor];  
        [self.navigationController.navigationBar addSubview:btnAdd];
        [btnAdd addTarget:self action:@selector(btnAdd_clicked:) forControlEvents: UIControlEventTouchUpInside]; 
    }
    - (void)viewWillAppear:(BOOL)animated
    {   
        [btnAdd setHidden:FALSE];
    }
    - (void)viewWillDisappear:(BOOL)animated
    {
        [btnAdd setHidden:TRUE];    
    }
    - (void) btnAdd_clicked
    {
        // Your logic...
    }

答案 2 :(得分:0)

您应该尝试使用此link。它允许在导航控制器上有任何导航时将自定义图像发送回去。

答案 3 :(得分:0)

由于你说UINavigationBar落后于背景,你可以使用

[UIView bringSubviewToFront:barName];

把它带到前面,或

[UIView sendSubviewToBack:background];

将背景发送到视图堆栈的底部。

答案 4 :(得分:0)

调用setNeedsDisplay是否有任何影响?特别是关于使用drawRect创建自定义背景的更新?

如果您需要将显示更新为任何更改的表示形式(通常是通过更改为drawRect),通常需要

setNeedsDisplay。

答案 5 :(得分:0)

在我的情况下,我在整个应用程序中使用自动布局,并编写了一个自定义按钮,我在构造函数中有以下行:

button.setTranslatesAutoresizingMaskIntoConstraints(false)

当我尝试使用此按钮作为UIBarButtonItem的自定义视图时,它无法绘制。

简而言之,请确保将translatesAutoResizingMaskIntoConstraints设置为true