【问题标题】:Strange behavior of UIBarButtonItem when using UIAppearance使用 UIAppearance 时 UIBarButtonItem 的奇怪行为
【发布时间】:2013-01-14 19:04:20
【问题描述】:

我正在使用 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];

【问题讨论】:

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

标签: iphone ios xcode uinavigationbar uibarbuttonitem


【解决方案1】:

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

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

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

【讨论】:

  • 有没有找到解决方案?我已经尝试继承 UINavigationBar 的 layoutSubviews 来更改按钮的框架,但这有很多问题。
  • 您可以从自定义 UIButton 创建一个 UIBarButtonItem。您可以根据需要设置 UIButton 的样式,并且不需要 UIAppearance 代理。有了这个解决方法,就不需要子类了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多