Ios SetbackButtonBackground外观怪异的图像

Ios SetbackButtonBackground外观怪异的图像,ios,objective-c,xcode,uinavigationcontroller,uibarbuttonitem,Ios,Objective C,Xcode,Uinavigationcontroller,Uibarbuttonitem,在AppDelegate.m中为我的自定义导航栏使用此选项: UIImage *NavigationPortraitBackground = [[UIImage imageNamed:@"gradient_main"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)]; [[UINavigationBar appearance] setBackgroundImage:NavigationPortraitBackground for

在AppDelegate.m中为我的自定义导航栏使用此选项:

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)的按钮也存在类似问题。按钮显示良好,但我可以单击图像外的按钮:(

问题的根源在于,您提供的是一个可调整大小的图像,没有uiedgeinset,也没有指定调整大小的样式。UIBarButtonItem上的文本实际上居中!如果您测量文本两侧的距离,您会发现它是相同的

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

[[UIImage imageNamed:@"btn_nav_default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
你告诉iOS@“btn_nav_default.png”是一个可调整大小的图像,它应该平铺。它基本上是将图像的副本并排放置,直到覆盖整个宽度。如果您查看,您会发现ResizebleMageWithCapinsets的默认行为是平铺。您将要调用
ResizebleMageWithCapinsets:ResizengMode:
和为调整大小模式传入
UIImageResizengModeStretch

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

如果您对冗长的解释不感兴趣,请复制粘贴此代码(但不保证此代码可以编译…):


问题的根源在于,您提供的是一个可调整大小的图像,没有uiedgeinset,也没有指定调整大小的样式。uibarbuttonite上的文本实际上是居中的!如果您测量文本两侧的距离,您会发现它是相同的

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

[[UIImage imageNamed:@"btn_nav_default.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
你告诉iOS@“btn_nav_default.png”是一个可调整大小的图像,它应该平铺。它基本上是将图像的副本并排放置,直到覆盖整个宽度。如果您查看,您会发现ResizebleMageWithCapinsets的默认行为是平铺。您将要调用
ResizebleMageWithCapinsets:ResizengMode:
和为调整大小模式传入
UIImageResizengModeStretch

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

如果您对冗长的解释不感兴趣,请复制粘贴此代码(但不保证此代码可以编译…):


你可以试着和我一起玩

[[UIBarButtonItem appearance] setBackButtonBackgroundVerticalPositionAdjustment:5 forBarMetrics:UIBarMetricsDefault]; 

在ios 5中,放置插图后,您可以尝试使用

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

great:)现在我只需要为ResizebleimageWithCapInsets:resizingMode:在ios 5中:(great:)现在我只需要为ResizebleimageWithCapInsets:resizingMode:在ios 5中提供一个备选方案:(