带按钮的iPhone自定义导航栏无法点击

时间:2010-09-10 01:28:29

标签: iphone objective-c cocoa-touch ipad

我有一个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?

1 个答案:

答案 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类或其他东西上做一些时髦的类别覆盖。