我有一个iPhone / iPad通用应用程序,我想要一个自定义导航栏,导航栏的上半部分包含我们公司的徽标,下半部分是标准导航栏。
我想出了如何做到这一点,在下面的代码中显示,但我的UIButton“logosButton”并不总是响应被点击,似乎只有按钮的某些部分是活动的,而其他部分根本没有做任何事情......我无法弄清楚为什么会这样。
- (void)viewDidLoad {
[super viewDidLoad];
[[self view] addSubview: navController.view];
float width = IS_IPAD ? 768.0f : 320.0f;
float logosHeight = IS_IPAD ? 20.0f : 20.0f;
float barHeight = IS_IPAD ? 32.0f : 32.0f;
self.navBar = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, logosHeight, width, barHeight)];
UIView *tempView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, logosHeight)];
UIButton *logosButton = [[UIButton alloc] init];
[logosButton setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState:UIControlStateNormal];
[logosButton setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState:UIControlStateHighlighted];
[logosButton addTarget:self action:@selector(logosButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[logosButton setFrame: CGRectMake(0, 0, width, logosHeight)];
[tempView addSubview: logosButton];
[[self view] addSubview: tempView];
[tempView release];
[[self view] addSubview: self.navBar];
self.navItem = [[UINavigationItem alloc] initWithTitle: @"Home"];
[self.navBar pushNavigationItem:self.navItem animated:NO];
}
方法:logosButtonClicked
当我点击UIButton时会不时被解雇,但我明确地点击某些根本没有发生任何事情的地方......
非常令人沮丧,我似乎没有看到关于其活跃位置的模式,但有人可以帮忙吗?
修改
我想我偶然发现了一些事情,我将按钮更改为UIButtonTypeRoundedRect并删除了图像(并使其更大)并且看起来我无法点击按钮的底部或顶部部分按钮是圆形的。因此,中间的矩形部分是我可以点击的唯一部分......为什么会这样?
编辑2 对于审阅此问题的任何人,请参阅taber关于其答案的最新编辑。由于某种原因导航控制器正在吃东西,我需要弄清楚为什么会这样,可能是一个bug?
答案 0 :(得分:1)
最终答案:)
好的,在查看项目之后,看起来位于按钮下方的UINavigationController正在全球范围内进行触摸。这绝对是奇怪的,因为它被添加为您的按钮下面的子视图。因此,UINavigationController必须有某种时髦的框架/触摸式食物。我试图设置navigationController.titleView.userInteractionEnabled = NO,但无济于事。如果有人知道如何基本上使UINavigationController和UINavigationBar不吃触摸(我说的是没有按钮存在的背景)那么请插入。当UINavigationController没有添加到视图时,UIButton触摸工作正常。
原始答案
可能是[self view]或tempView中的其他一些UI元素位于按钮顶部并拦截了水龙头。您可能想要尝试注释视图中的所有其他内容和/或尝试在其上设置userInteractionEnabled属性,如下所示:
[otherUIElement setUserInteractionEnabled: NO];
修改强> 此代码使您可以单击圆形矩形边但不单击标题文本。所以我怀疑它是某种子视图阻止按钮捕捉水龙头。
[logosButton addTarget:self action:@selector(logosButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
[logosButton setFrame: CGRectMake(0, 0, 320.0, 50.0)];
[logosButton setTitle: @"HELLO" forState: UIControlStateNormal];
[logosButton.titleLabel setUserInteractionEnabled: YES];
编辑#2:
尝试使用此子类按钮,看看问题是否仍然存在:
// NavBtn.h
@interface NavBtn : UIButton {
}
-(id)initWithTitle:(NSString *)text;
@end
// NavBtn.m
#import "NavBtn.h"
@implementation NavBtn
- (id)initWithTitle:(NSString *)text {
if ((self = [super initWithFrame: CGRectMake(0, 0, 320, 50)])) {
[self setTitle: text forState: UIControlStateNormal];
self.backgroundColor = [UIColor clearColor];
self.opaque = NO;
[self setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState: UIControlStateNormal];
[self setBackgroundImage:[UIImage imageNamed:@"logo_bar_alone.png"] forState: UIControlStateHighlighted];
}
return self;
}
// i guess you shouldn't need to mess with layoutSubviews
@end
将其加载到您的视图中:
#import "NavBtn.h"
... in viewDidLoad, etc ...
NavBtn *btn = [[NavBtn alloc] initWithTitle: @"hey"];
[self.view addSubview: btn];
[btn release];
如果这不起作用,必须有某种第三方库在你的UIButton类或其他东西上做一些时髦的类别覆盖。