我正在使用Xcode 8.0。 我在我的NavBar中添加了一个自定义左栏按钮:
UIImage * imageNormal = [UIImage imageNamed:@"InfoIcon"];
UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(testPressed ) forControlEvents:UIControlEventTouchUpInside];
[button setBackgroundImage:imageNormal forState:UIControlStateNormal];
// set the frame of the button
button.frame = CGRectMake(0, 0, imageNormal.size.width, imageNormal.size.height);
UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, imageNormal.size.width, imageNormal.size.height)];
[view addSubview:button];
// set the barbuttonitem to be the view
UIBarButtonItem * barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:view];
self.navigationItem.leftBarButtonItem = barButtonItem;
这是我得到的:
遗憾的是,我的按钮未居中,因为导航栏的自定义图像高于标准。但是,如果我按下信息图标就可以了。 如果我用这行代码更改图标位置:
button.frame = CGRectMake(0, -30, imageNormal.size.width, imageNormal.size.height);
我得到了正确的定位:
但在这种情况下,条形按钮不再可点击,我不明白为什么会发生这种情况。
作为解决方法,我将一个手势附加到视图:
UITapGestureRecognizer *_tapOnVideoRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self.revealViewController action:@selector(revealToggle:)];
[view addGestureRecognizer:_tapOnVideoRecognizer];
它可以工作,但点按在视图上而不在按钮上,这样当按下按钮时改变状态不起作用。
来自https://stackoverflow.com/a/12554715/1320479的@JakubKnejzlik 表明:这可以通过继承包装器视图(按钮的superview,uibarbuttonitem的自定义视图)并重写hittest方法来相应地返回按钮来修复。 但我不知道该怎么做