微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

iOS 7:如何为UIControlStateHighlighted设置UIBarButtonItem backButtonBackgroundImage?

我正在设置正常和突出显示状态下的后退按钮的背景图像.
- (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作为自定义视图.

原文地址:https://www.jb51.cc/iOS/336583.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐