问题:使用resizableImageWithCapInsets
设置后,Appearance Proxy未遵循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];
}
产生以下结果:
所以我想我找到了解决这个问题的方法,但我仍然有点困惑,为什么我的原始实现不起作用。在我看来,外观代理旨在被使用,这样你就不必改变对象的每个单独实例的外观 - 正是我最终要做的事情。谁能向我解释这里发生了什么?这是一个错误,还是我做错了什么?