使用UIAppearance时UIBarButtonItem的奇怪行为

时间:2013-01-14 19:04:21

标签: iphone ios xcode uinavigationbar uibarbuttonitem

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

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

enter image description here

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

enter image description here

编辑:代码

    //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];

1 个答案:

答案 0 :(得分:5)

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

  

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

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