2013-01-14 3 views
2

Я настраиваю такие элементы, как панель навигации, панель вкладок и uibarbuttonitem, используя UIAppearance. Он отлично работает, за исключением очень странного поведения элементов UIBarButtonItem. На верхнем уровне иерархии диспетчера навигации все выглядит хорошо, но если я нажму следующий контроллер вида, элементы UIBarButtonItem немного сдвинутся вниз, но в то же время кнопка возврата останется в правильном положении. Я приложил два изображения, чтобы проиллюстрировать мою проблему.Странное поведение UIBarButtonItem при использовании UIAppearance

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

Вы можете создать UIBarButtonItem из пользовательского UIButton. Вы можете настроить UIButton так, как хотите, и вам не нужен прокси-сервер UIAppearance. При таком обходном пути нет необходимости в подклассе. – burki

Смежные вопросы