像android九补丁一样拉伸图像?

Posted

技术标签:

【中文标题】像android九补丁一样拉伸图像?【英文标题】:stretch a Image like android nine-patch? 【发布时间】:2011-10-25 07:45:53 【问题描述】:

UIImage 方法:

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight.

这里的可拉伸区域被强制为单个像素高/宽。

我无法设置可拉伸区域,所以我想知道:有没有 UIImage 类别可以做到这一点?

我google了一下,找到了一个lib。

问题: Is there a nine-patch loader for iPhone?

公告:http://blog.tortuga22.com/2010/05/31/announcing-tortuga-22-ninepatch/

这是一张源图片,我想拉伸里面的灰色矩形。

提前致谢。

【问题讨论】:

你为什么不使用 9-patch-loader-for-iphone 可能有更好的解决方案,比如 uiimage 类别,像这样: - (UIImage *)imageWithStretchableRect:(CGRect)rect destRect:(CGRect)destRect 我使用这个库,效果不是我想要的。我想重复图像的某些部分。 【参考方案1】:

实现此目的的一种方法是使用以下方法,

UIImage * backgroundImg = [UIImage imageNamed:@"bg.png"];

backgroundImg = [backgroundImg resizableImageWithCapInsets:UIEdgeInsetsMake(2,2, 2, 2)];

[imgView setImage: backgroundImg];

UIEdgeInsetsMake(2,2, 2, 2) 是您希望不可拉伸的像素数量。

【讨论】:

【参考方案2】:

Tortuga22 software可以实现九个补丁

你可以从这个 GitHub here找到源代码

这样使用

[btnSubmit setImage: [TUNinePatchCache imageOfSize:[btnSubmit bounds].size 
                                forNinePatchNamed:@"imgNormalBackground"]
                       forControlState:UIControlStateNormal];

【讨论】:

【参考方案3】:

ios5 开始,您可以使用resizableImageWithCapInsets: 来实现这一点。

【讨论】:

【参考方案4】:

我不想为我们拥有的简单的 9 个补丁图像加载这么多代码。所以无论如何,对于那些感兴趣的人来说,这里有一个简单的解决方案。它对我们的 3 像素拉伸区域进行了硬编码,但您可以根据需要轻松调整这些区域,或者使用一些基本代码在图像中找到这些区域,并使用它来代替我硬编码的插入参数。

+ (UIImage *) makeNinePatchImage:(UIImage *)image;

    //Clear the black 9patch regions
    CGRect imageRect = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    UIGraphicsBeginImageContextWithOptions(image.size, NO, [UIScreen mainScreen].scale);
    [image drawInRect:imageRect];

    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextClearRect(context, CGRectMake(0, 0, image.size.width, 1));
    CGContextClearRect(context, CGRectMake(0, 0, 1, image.size.height));

    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    UIEdgeInsets insets;

    //hard coded for now, could easily read the black regions if necessary
    insets.left = insets.right = image.size.width / 2 - 1;
    insets.top = insets.bottom = image.size.height / 2 - 1;

    UIImage *nineImage = [image resizableImageWithCapInsets:insets     
                          resizingMode:UIImageResizingModeStretch];

    return nineImage;


然后要在按钮的背景中使用它,只需这样称呼它:

[self.dummyButton setBackgroundImage:[EVUtility makeNinePatchImage:learnMoreImage] forState:UIControlStateNormal];

完成。

【讨论】:

【参考方案5】:

如果我理解正确,您希望矩形的长度和高度都增加。 虽然可能有更有效的解决方案,但我可以建议将边界分解为一个基本单元。一个接一个地重复添加此图像,以形成所需长度和高度的边框矩形。然后用灰色绘制内部矩形。

【讨论】:

是的,完全正确。我只想重复部分图像***.com/questions/7901059/… 谢谢你的回复。你的回答对我有帮助

以上是关于像android九补丁一样拉伸图像?的主要内容,如果未能解决你的问题,请参考以下文章

Android开发之点九图的制作说明

Android 可绘制语音气泡

Android Switch拇指图像拉伸

Android:拉伸和裁剪图像(但仍然是纵横比)

Android : 像 Facebook 一样有多个图像和视频的新闻源

将图像放在另一个在 Android 中拉伸的图像上