2

问题:当使用外观代理设置时,没有按照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];
}

这会产生以下结果:

正确的按钮背景

所以我想我找到了解决这个问题的方法,但我仍然对为什么我的原始实现不起作用感到有些困惑。在我看来,外观代理的目的是为了让您不必更改对象的每个单独实例的外观——这正是我最终必须要做的。谁能向我解释这里发生了什么?这是一个错误,还是我做错了什么?

4

0 回答 0