在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];
结果是:
如您所见,该按钮似乎重复出现。按钮尺寸为61x30。并且文本未居中。
如果文字较短(例如菜单),则按钮图像会被截断;如果文字较长,则按钮将会重复。
具有较小图标(30x30)的按钮也有类似问题。该按钮显示正常,但我可以单击图像外部的按钮:(
最佳答案
问题的根源在于,您提供的是可调整大小的图像,而没有UIEdgeInsets,也没有指定调整大小的样式。 UIBarButtonItem上的文本实际上居中!如果您测量文本两边的距离,您将意识到它是相同的。
如果您查看为UIBarButtonItem提供的图像:
[[UIImage imageNamed:@"btn_nav_default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
您是在告诉iOS @“ btn_nav_default.png”是可调整大小的图像,它应该平铺。它基本上是在复制图像并将它们并排放置,直到覆盖整个宽度。如果查看UIImage's Documentation,您将看到resizableImageWithCapInsets的默认行为是平铺。您将要呼叫
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];