UIImage resizableImageWithCapInsets:无法按预期工作

Bra*_*ell 13 xcode cocoa-touch objective-c ios5 uiappearance

我正在编写面向iOS 5.0+平台的第一款iOS应用.我正在使用该UIAppearance协议来自定义应用程序UI.

我正在尝试更改UIBarButtonItem整个应用程序的背景.由于我UIBarButtonItem可能会根据所使用的文字或图标改变尺寸,我正试图利用UIImage resizableImageWithCapInsets:我的背景png.

我最初在Ray Wenderlich找到了我需要的代码.使用完全相同的代码,图像与上述教程中使用的图像非常接近,我得到了奇怪的结果.也许这只是我对Cocoa Touch的经验不足.

这是我正在使用的代码.

DreamsAppDelegate.m - customizeAppearance:

UIImage *btnBg = [[UIImage imageNamed:@"navBarButton-bg"] 
          resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6)];

[[UIBarButtonItem appearance] setBackgroundImage:btnBg 
                                        forState:UIControlStateNormal 
                                      barMetrics:UIBarMetricsDefault];
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试使用的png背景图像

png背景

这是结果(在模拟器中)

尝试使用resizableImageWithCapInsets的结果:

Don*_*mer 19

之间的图像的部分leftright之间,以及topbottom,平铺填补图像所需的空间.试试UIEdgeInsetsMake(15, 6, 15, 6).

概括地说,如果您的图像具有连续渐变,则重复的部分应该仅为1像素高.由于您的按钮图像高31像素,因此topbottom(第一个和第三个参数UIEdgeInsetsMake)应该加到30.它们不必相等; UIEdgeInsetsMake(8, 6, 22, 6)将重复的部分移动,导致更苍白的背景.

您是否附有平原或视网膜('@ 2x')图像的文件?插图必须在普通版本的大小范围内.


Ano*_*ite 17

我有完全一样的问题.

您可以做的另一件事是设置UIImageResizingModeStretch的resizingMode.它解决了我的问题.

Hopwever,它在IOS5中不可用.所以我的解决方案是按照其他人的说法去做.意识到tileable侧应该只是一个像素.无论如何,大多数按钮在中间变化不大.

所以,使用这段代码:

-(UIImage *) resizableImageWithCapInsets2: (UIEdgeInsets) inset
    {
        if ([self respondsToSelector:@selector(resizableImageWithCapInsets:resizingMode:)])
        {
            return [self resizableImageWithCapInsets:inset resizingMode:UIImageResizingModeStretch];
        }
        else
        {
            float left = (self.size.width-2)/2;//The middle points rarely vary anyway
            float top = (self.size.height-2)/2;
            return [self stretchableImageWithLeftCapWidth:left topCapHeight:top];
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 感谢您花时间回答这个问题,即使这是一篇较旧的帖子.非常感激! (3认同)