UIBarButtonItem外观不与resizableImageWithCapInsets一起使用

时间:2013-01-27 20:29:28

标签: ios uibarbuttonitem scaling appearance

问题:使用resizableImageWithCapInsets

设置后,Appearance Proxy未遵循UIBarButtonItem背景图片的缩放比例

我已经建立了一个项目,其中包含一些测试资产,用于我想要完成的任务。我有一个背景图像,以及我的UIBarButtonItem的两个图标图像。他们是:

背景(50x34):

Background Image

图标(30x30):

Circle Icon Square Icon

这些图标是@ 2x版本(因此它们是上面列出的尺寸的两倍),但请放心,我在项目中也有标准资产(大小只有一半)

创意,我知道!但这是问题 - 我想在我的按钮背景图像上添加一些额外的填充,以便图标仅缩放背景图像的绿色部分。这是我在AppDelegate中的代码:

UIImage *bgImage = [[UIImage imageNamed:@"testbutton2"] resizableImageWithCapInsets:UIEdgeInsetsMake(16, 20, 16, 20)];
[[UIBarButtonItem appearance] setBackgroundImage:bgImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

这对于UIBarButtonItem的第一个实例来说非常有用。但是对于每个后续实例,图像的可调整大小的部分都被完全忽略。看看:

Erroneous background images

如你所见,在第一屏上,一切都按计划进行。但是,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];
}

产生以下结果:

Correct Button Backgrounds

所以我想我找到了解决这个问题的方法,但我仍然有点困惑,为什么我的原始实现不起作用。在我看来,外观代理旨在被使用,这样你就不必改变对象的每个单独实例的外观 - 正是我最终要做的事情。谁能向我解释这里发生了什么?这是一个错误,还是我做错了什么?

0 个答案:

没有答案