2013-01-14 62 views
2

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

1)在导航控制器层次

enter image description here

2)第二视图控制器在导航控制器层次

enter image description here

EDIT首先视图控制器:所述的代码

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

我们可以看到你的UIAppearance代码和UIbarbuttonItem代码吗? –

回答

5

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

所以,定制的UIBarButtonItem时,永远记住,一个 的UIBarButtonItem不能高于30pt高。这意味着自定义艺术作品不应该超过这个尺寸。

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

+0

有没有想出一个解决方案?我已经尝试了UINavigationBar的layoutSubviews子类来改变按钮的框架,但是这有很多问题。 – akaru

+0

你可以从一个自定义的UIButton创建一个UIBarButtonItem。您可以根据需要设计UIButton的样式,并且不需要UIAppearance代理。通过该解决方法,不需要子类。 – burki