具有奇怪外观的setBackButtonBackgroundImage

时间:2013-04-20 11:45:59

标签: ios objective-c xcode uinavigationcontroller uibarbuttonitem

在AppDelegate.m中使用它来获取我自定义的NavBar:

UIImage *NavigationPortraitBackground = [[UIImage imageNamed:@"gradient_main"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UINavigationBar appearance] setBackgroundImage:NavigationPortraitBackground forBarMetrics:UIBarMetricsDefault];
UIImage *barBackBtnImg = [[UIImage imageNamed:@"btn_nav_default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
[[UIBarButtonItem appearance] setBackButtonBackgroundImage:barBackBtnImg forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

结果:

enter image description here

正如您所见,按钮似乎重复了。按钮尺寸为61x30。文本没有居中。 如果文本较短(例如菜单),则按钮图像被剪切,如果文本较长,则按钮重复。 具有较小图标(30x30)的按钮也存在类似问题。按钮显示正常,但我可以点击图像外的按钮:(

2 个答案:

答案 0 :(得分:5)

问题的根源在于您提供的是不带UIEdgeInsets的可调整大小的图像,并且未指定调整大小样式。 UIBarButtonItem上的文本实际上是居中的!如果你测量文本两边的距离,你会发现它是一样的。

如果您查看为UIBarButtonItem提供的图像:

[[UIImage imageNamed:@"btn_nav_default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];

你告诉iOS @“btn_nav_default.png”是一个可调整大小的图像,它应该平铺。它基本上是复制您的图像并将它们并排放置,直到覆盖整个宽度。如果查看UIImage's Documentation,您会看到resizableImageWithCapInsets的默认行为是tile。您需要致电resizableImageWithCapInsets:resizingMode:并传递UIImageResizingModeStretch以进行调整大小模式。

话虽如此,这还不够。之后你会看到整个图像被拉伸,完全摧毁你漂亮的圆角。您需要提供UIEdgeInsets,告诉UIImage“您无法延伸此部分”。在这种情况下,提供UIEdgeInsets UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f)(或类似的东西)将起作用。

如果您对长篇解释不感兴趣,请复制粘贴此代码(不保证此编译虽然......):

[[UIImage imageNamed:@"btn_nav_default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 10.0f) resizingMode:UIImageResizingModeStretch];

答案 1 :(得分:0)

您可以尝试使用

[[UIBarButtonItem appearance] setBackButtonBackgroundVerticalPositionAdjustment:5 forBarMetrics:UIBarMetricsDefault]; 
放入插图后,在ios 5中