我正在设置正常和突出显示状态下的后退按钮的背景图像.
- (void)configureBackButtonInNavigationItem:(UINavigationItem *)item
{
UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"back"
style:UIBarButtonItemStyleBordered target:nil action:NULL];
[backBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]} forState:UIControlStatenormal];
[backBarButtonItem setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor orangeColor]} forState:UIControlStateHighlighted];
// white arrow image
UIImage *normalImage = [[[UIImage imageNamed:@"btn_normal"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] resizableImageWithCapInsets:UIEdgeInsetsMake(0.f,17.f,0.f,0.f)];
// orange arrow image
UIImage *pressedImage = [[[UIImage imageNamed:@"btn_on_press"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] resizableImageWithCapInsets:UIEdgeInsetsMake(0.f,0.f)];
[backBarButtonItem setBackButtonBackgroundImage:normalImage
forState:UIControlStatenormal barMetrics:UIBarMetricsDefault];
[backBarButtonItem setBackButtonBackgroundImage:pressedImage
forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
[backBarButtonItem setBackgroundImage:normalImage
forState:UIControlStatenormal barMetrics:UIBarMetricsDefault];
[backBarButtonItem setBackgroundImage:pressedImage
forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
NSLog(@"norMAL: %@ HIGHLIGHTED: %@",[backBarButtonItem backButtonBackgroundImageForState:UIControlStatenormal barMetrics:UIBarMetricsDefault],[backBarButtonItem backButtonBackgroundImageForState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]);
item.backBarButtonItem = backBarButtonItem;
NSLog(@"norMAL: %@ HIGHLIGHTED: %@",[backBarButtonItem backButtonBackgroundImageForState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]);
}
输出如下:
norMAL: <_UIResizableImage: 0x16b55e10> HIGHLIGHTED: <_UIResizableImage: 0x16b593d0> norMAL: <_UIResizableImage: 0x16b55e10> HIGHLIGHTED: <_UIResizableImage: 0x16b593d0>
但是,突出显示状态的观察结果只是将设置为正常状态的调光,而不是使用正确的突出显示的图像.
正常:
突出显示(箭头仍然为白色,按钮意外变暗):
请不要发布关于使用leftBarButtonItem或UIButton作为自定义视图的答案.这两种方法都可以在iOS 7上制作滑动向后的行为.
UPD:关于这个问题的填充雷达#17481106.
UPD2:雷达#17481106在iOS 8中修复.
解决方法
目前苹果在InteractivePopGestureRecognizer上存在错误(这样可以在推动动画后滑动导航控制器的视图,您将看到嵌套的流行动画可能会导致控制台中的导航栏警告被损坏),顺便说一下,我们可以让一个小黑客工作围绕这个bug.
这是一个适用于我的解决方案,
将NavigationController类子类化并使其委托该手势
@interface CBNavigationController : UINavigationController
@end
@implementation CBNavigationController
- (void)viewDidLoad
{
__weak CBNavigationController *weakSelf = self;
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
self.interactivePopGestureRecognizer.delegate = weakSelf;
self.delegate = weakSelf;
}
}
// Hijack the push method to disable the gesture
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
self.interactivePopGestureRecognizer.enabled = NO;
[super pushViewController:viewController animated:animated];
}
#pragma mark UINavigationControllerDelegate
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animate
{
// Enable the gesture again once the new controller is shown
if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
self.interactivePopGestureRecognizer.enabled = YES;
}
@end
当用户在转换过程中开始向后滑动时,弹出事件会堆积并导致导航堆栈“损坏”.我的解决方法是在推送转换期间临时禁用手势识别器,并在新的视图控制器加载时再次启用.再次,使用UINavigationController子类更容易.
之后,您可以冷静地使用item.leftBarButtonItem和UIButton作为自定义视图.