Iphone 如何拉伸UIImage以适应文本?

Iphone 如何拉伸UIImage以适应文本?,iphone,objective-c,ios,xcode,uiimage,Iphone,Objective C,Ios,Xcode,Uiimage,我正在我的应用程序中实现一个标签系统,为此,我需要一个标签的背景图像和文本来覆盖该图像。但问题是——如何拉伸图像以“适合”文本“数学”很好用,但像“经济学”这样的词就不行了,因为它会与背景图像重叠 这是我的标签的外观: 我的最佳猜测是使用可拉伸图像,这些只是普通图像,您可以在其中设置iOS可以拉伸的部分 这些图像很容易制作: UIImage *imageTemp = [UIImage imageNamed:@"ButtonBackground.png"]; // For iOS 4.3 and

我正在我的应用程序中实现一个标签系统,为此,我需要一个标签的背景图像和文本来覆盖该图像。但问题是——如何拉伸图像以“适合”文本“数学”很好用,但像“经济学”这样的词就不行了,因为它会与背景图像重叠

这是我的标签的外观:


我的最佳猜测是使用可拉伸图像,这些只是普通图像,您可以在其中设置iOS可以拉伸的部分

这些图像很容易制作:

UIImage *imageTemp = [UIImage imageNamed:@"ButtonBackground.png"];

// For iOS 4.3 and lower
UIImage *stretchableImage = [imageTemp stretchableImageWithLeftCapWidth:20 topCapHeight:10];

// if you are targetting iOS 5 and higher
UIImage *stretchableImage = [imageTemp resizableImageWithCapInsets:UIEdgeInsetsMake(10, 10, 20, 20)];

20
10
只是一个例子,它们对于您的图像可能不同。如果这些是
ui按钮
the,您可以将可拉伸图像设置为按钮的背景,它将随着按钮正确增长。如果要为
UILabel
设置代码中的文本,可以使用
sizeWithFont:constrainedToSize:
计算字符串的宽度。然后设置图像的正确大小。

您可以找到字符串宽度(在您的情况下可能是UILabel),如下所示

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 
一旦知道文本长度,您就可以使用它并将背景设置为可拉伸图像

UIImage *strechableImage = [[UIImage imageNamed:@"tagImage"] resizableImageWithCapInsets:UIEdgeInsetsMake(3, 3, 3, 25)]
插图(封口)为(顶部、左侧、底部、顶部),用于定义未缩放/拉伸的区域(例如圆角)

来自Apple文档


在缩放图像或调整图像大小期间,不会缩放或调整由封口覆盖的区域的大小。相反,在每个方向上未被封口覆盖的像素区域将从左到右、从上到下平铺,以调整图像大小

您首先需要计算文本的预期大小,然后为图像提供相应的框架。如果需要,您可以使用具有封口宽度和封口高度的图像。下面是代码片段

    CGSize maximumLabelSize = CGSizeMake(600,52);  // maximum possible size
    CGSize expectedLabelSize = [brandName sizeWithFont:[UIFont fontWithName: @"Helvetica-Bold" size:20] 
                                     constrainedToSize:maximumLabelSize 
                                         lineBreakMode:UILineBreakModeTailTruncation]; 

    UIImage *centerStretchedImage =[[UIImage imageNamed:@"yourImage.png"] stretchableImageWithLeftCapWidth:10.0 topCapHeight:0];

    CGRect frame = CGRectMake(x, y, expectedLabelSize.width+20,52);
    UIImageView *dynamicImage = [[UIImageView alloc] initWithFrame:frame];
    dynamciImage.image = centerStretchedImage;

从StretcableImageWithLeftCapWidth:创建并返回具有指定cap值的新图像对象。(在iOS 5.0中已弃用。弃用。请使用可调整大小的图像WithCapInsets:而不是指定内部为1x1区域的cap insets。)是的,您的回答是正确的,但如果您的目标是iOS 4.3,您也可能希望使用
StretcableImageWithLeftCapWidth:topCapHeight:
。如果我们的目标是iOS 4.3以后的版本,则为True。对于iOS 5.0以后的版本,不推荐使用此选项。