问题:当使用外观代理设置时,没有按照resizableImageWithCapInsets的 UIBarButtonItem 背景图像的缩放
我已经建立了一个项目,其中包含一些我想要完成的测试资产。我的 UIBarButtonItem 有一个背景图像和两个图标图像。他们是:
背景(50x34):
图标 (30x30):
这些图标是@2x 版本(因此它们是上面列出的大小的两倍),但请放心,我也有项目中的标准资源(大小的一半)
创意,我知道!但问题是——我想在我的按钮背景图像上添加一些额外的填充,以便图标仅缩放背景图像的绿色部分。这是我在 AppDelegate 中的代码:
UIImage *bgImage = [[UIImage imageNamed:@"testbutton2"] resizableImageWithCapInsets:UIEdgeInsetsMake(16, 20, 16, 20)];
[[UIBarButtonItem appearance] setBackgroundImage:bgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
这适用于 UIBarButtonItem 的第一个实例。但是,对于每个后续实例,图像的可调整大小部分都将被完全忽略。一探究竟:
如您所见,在第一个屏幕上,一切都按计划进行。但是,UIBarButtonItem 的每次后续使用都没有正确缩放。
现在,我确实设法解决了这个问题。我必须在 UIBarButtonItem 的每个实例上设置外观。我通过拥有一个所有视图控制器都继承自的通用 UIViewController 超类来做到这一点。在其中,我有以下代码:
- (void)viewDidLoad
{
[super viewDidLoad];
UIImage *bgImage = [[UIImage imageNamed:@"testbutton2"] resizableImageWithCapInsets:UIEdgeInsetsMake(16, 20, 16, 20)];
[self.navigationItem.rightBarButtonItem setBackgroundImage:bgImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
[self.navigationItem.leftBarButtonItem setBackgroundImage:bgImage
forState:UIControlStateNormal
barMetrics:UIBarMetricsDefault];
}
这会产生以下结果:
所以我想我找到了解决这个问题的方法,但我仍然对为什么我的原始实现不起作用感到有些困惑。在我看来,外观代理的目的是为了让您不必更改对象的每个单独实例的外观——这正是我最终必须要做的。谁能向我解释这里发生了什么?这是一个错误,还是我做错了什么?