好的,这是一个奇怪的。我现在一直在抨击它,试图调试一小时。
我创建了一个带有自定义视图的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时如何强制背景被推回。
答案 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
。