【问题标题】:UIImage resizableImageWithCapInsets: not working as expectedUIImage resizableImageWithCapInsets:没有按预期工作
【发布时间】:2012-05-05 17:57:14
【问题描述】:

我正在编写我的第一个针对 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];

这是我尝试使用的 png 背景图片

这是结果(在模拟器中)

【问题讨论】:

    标签: objective-c xcode cocoa-touch ios5 uiappearance


    【解决方案1】:

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

    概括地说,如果您的图像具有连续渐变,则重复部分应该只有 1 个像素高。由于您的按钮图像高 31 像素,topbottomUIEdgeInsetsMake 的第一个和第三个参数)应该加到 30。它们不必相等; UIEdgeInsetsMake(8, 6, 22, 6) 会将重复的部分向上移动,导致背景变浅。

    另外,您附加的文件是普通版还是视网膜 ('@2x') 版本的图像?插图必须在普通版本的大小范围内。

    【讨论】:

    • 感谢您的回复。发布的图片是@2x。所以我应该把我的测量值削减到 (0, 3, 0, 3)?你是说我应该让我的图像中间1px宽?我理解为什么会这样,但是我遵循的教程有一个 30 像素 x 40 像素的图像,具有与我相同的样式渐变,它似乎工作得很好(使用我现在使用的 UIEdgeInsetsMake,只是调整了一个像素因为我的圆角半径)。
    • 诀窍是:您可以使用 0 表示顶部和底部如果您的背景图像与导航栏按钮的高度相同。它只是用您现有的渐变填充该空间。您的图像不是视网膜导航按钮的高度,因此它将被拉伸或重复以填充该高度。您必须提供顶盖和底盖大小(第一个和第三个参数)。从(7, 3, 7, 3) 开始。这会留下一些条纹,但希望能更清楚地了解正在发生的事情。
    • 啊,这确实更有意义。视网膜导航栏按钮的大小是多少?我正在从视网膜大小的 PSD 文件中切出我的 UI 元素,所以如果我需要在 psd 文件上使 navBar 按钮 bg 更大并将其导出以获得我需要的东西,这对我来说很容易。
    • 仅从截图和测量来看,它们似乎有 60 像素高。但是,如果您确保您的封顶图像可以缩放到任何大小,您的组件将更加健壮。它适用于(7, 3, 7, 3) 吗?你明白为什么吗?
    • 看起来好一点,但还是错了。看到这个截图:i.imgur.com/9KEjj.png
    【解决方案2】:

    我也有同样的问题。

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

    但是,它在 IOS5 中不可用。所以我的解决方案是像其他人所说的那样做。意识到可平铺的一面应该只有一个像素。无论如何,大多数按钮在中间并没有太大变化。

    所以,使用这个代码:

    -(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];
            }
        }
    

    【讨论】:

    • 感谢您抽出宝贵时间回答这个问题,尽管这是一篇较旧的帖子。非常感谢!
    • 其他答案并没有真正解决问题。谢谢。
    • 谢谢!对我来说效果很好。
    猜你喜欢
    • 2021-10-19
    • 2020-03-18
    • 2012-06-14
    • 2014-11-15
    • 1970-01-01
    • 2012-07-02
    • 2011-09-07
    • 2013-03-03
    • 2015-05-18
    相关资源
    最近更新 更多