使用UIAppearance时UIBarButtonItem的奇怪行为

bur*_*rki 2 iphone xcode uinavigationbar uibarbuttonitem ios

我正在使用UIAppearance定制导航栏,标签栏和uibarbuttonitem等元素.它非常有效,除了UIBarButtonItem元素的一个非常奇怪的行为.在导航控制器层次结构的顶层,一切看起来都不错,但是如果我按下下一个视图控制器,UIBarButtonItem元素会向下移动一点点,但同时后退按钮会保持在正确的位置.我附上两张图片来说明我的问题.

1)导航控制器层次结构中的第一个视图控制器

在此输入图像描述

2)导航控制器层次结构中的第二个视图控制器

在此输入图像描述

编辑:代码

    //Change navigation bar appearance
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"GPNavigationBarBackground.png"] forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
    [[UINavigationBar appearance] setShadowImage:[UIImage imageNamed:@"GPNavigationBarShadow.png"]];

    [[UINavigationBar appearance] setTitleTextAttributes:
     [NSDictionary dictionaryWithObjectsAndKeys:
      [UIColor whiteColor], UITextAttributeTextColor,
      [UIFont boldSystemFontOfSize:17], UITextAttributeFont,nil]];
    [[UINavigationBar appearance] setTitleVerticalPositionAdjustment:2.f forBarMetrics:UIBarMetricsDefault];

    UIImage *buttonBackground = [[UIImage imageNamed:@"GPNavigationBarButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)];
    UIImage *buttonPressedBackground = [[UIImage imageNamed:@"GPNavigationBarButtonPressed.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 10, 0, 10)];

    UIImage *backButtonBackground = [[UIImage imageNamed:@"GPNavigationBarBackButton.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 10)];
    UIImage *backButtonPressedBackground = [[UIImage imageNamed:@"GPNavigationBarBackButtonPressed.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 15, 0, 10)];

    [[UIBarButtonItem appearance] setBackgroundImage:buttonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackgroundImage:buttonPressedBackground forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonBackground forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonPressedBackground forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];

    [[UIBarButtonItem appearance] setBackButtonBackgroundVerticalPositionAdjustment:1.f forBarMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setBackgroundVerticalPositionAdjustment:1.f forBarMetrics:UIBarMetricsDefault];
    [[UIBarButtonItem appearance] setTitlePositionAdjustment:UIOffsetMake(0, 1.f) forBarMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

bur*_*rki 5

好吧,经过对这个问题的沉思,我终于解决了它.上面的代码绝对正确.唯一的问题是UIBarButtonItem的背景图像的高度.UIAppearance代理允许您设置所有图形,但它不允许您更改UIBarButtonItem的高度.

因此,在自定义UIBarButtonItem时,请始终记住UIBarButtonItem不能高于30pt.这意味着自定义图稿不应超过此尺寸.

您可以设置高于30pt的背景图像,但是您将遇到与上述相同的问题.