使用stretchableImageWithLeftCapWidth调整图像大小

时间:2009-04-24 14:06:23

标签: iphone cocoa-touch

我正在尝试使用stretchableImageWithLeftCapWidth调整图像大小:它可以在模拟器上运行,但在设备上会出现垂直绿条。

我尝试过使用imageNamed,imageWithContentOfFile和imageWithData来加载图像,它不会改变。

UIImage *bottomImage = [[UIImage imageWithData:
     [NSData dataWithContentsOfFile:
    [NSString stringWithFormat:@"%@/bottom_part.png", 
     [[NSBundle mainBundle] resourcePath]]]] 
       stretchableImageWithLeftCapWidth:27 topCapHeight:9];

UIImageView *bottomView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 200+73, 100, 73)];
[self.view addSubview:bottomView];
UIGraphicsBeginImageContext(CGSizeMake(100, 73));
[bottomImage drawInRect:CGRectMake(0, 0, 100, 73)];
UIImage *bottomResizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
bottomView.image = bottomResizedImage;

查看结果:绿色条不应该出现在模拟器上。

alt text http://www.quicksnapper.com/files/5161/96232162149F1C14751048_m.png

7 个答案:

答案 0 :(得分:12)

你有没有想到这个?

似乎它可能是UIGraphicsGetImageFromCurrentImageContext的错误。如果我绘制一个具有透明度的图像,我会得到红色/绿色的文物。这些只出现在设备上(不在SIM卡中)。此外,如果我从图像中删除透明度,工件就会消失。

更新:更奇怪一些。我之前使用的是PNG,所以我尝试使用透明的gif代替。使用GIF,在SIM卡上显示工件问题。

<强>胜利!找到了解决方案:

在项目的构建设置中关闭“压缩PNG文件”。禁用此选项可使PNG透明度无任何工件。

答案 1 :(得分:5)

看起来你正在写很多不必要的代码,但也许这只是因为它脱离了上下文而且还有更多我不知道的。

获取图片:

[[UIImage imageName: @"bottom_part.png"] stretchableImageWithLeftCapWidth: 27 topCapHeight: 9];

您显示此图片的代码部分是什么?即你用什么方法调用上面的图像?

为什么不使用UIImageView并将图像放在那里?然后你不需要做任何图像上下文绘图等。

答案 2 :(得分:1)

在我的情况下,我有一个水平伸展的UIImageView。我在拉伸的图像中发现了一条奇怪的垂直白线。

上述解决方案对我不起作用。但是,以下做了:

将宽度值转换为int值:

myNewViewFrame.size.width = (int)newWidth;
myView.frame = myNewViewFrame;

希望它对你们有用......

答案 3 :(得分:0)

我昨晚花了5个小时进行调试,在xcode中禁用PNG压缩对我没有任何作用。

对于其他任何使用stretchableImageWithLeftCapWidth(在UIImage API中)遇到垂直,绿色,条形/线条/工件的人 - 这篇文章适合你。

我有一个21x30的自定义按钮背景,我想要加宽,但得到与OP相同的绿色条纹。我找到了一个用photoshop创建的PNG,效果很好 - 我的是用Gimp制作的。 无论如何,从文件中剥离所有块(除了三个必不可少的块)都没有区别。也没有禁用PNG压缩。

对我有用的是:

  1. 在我的图片上方添​​加一个空行(现在为21x31)。
  2. 在创建缩放图像时设置topCapHeight:0。
  3. 当我使用我的缩放图像时,我会绘制一个CGContext,后来用于制作UIImage。我用这个来画: [image drawInRect:CGRectMake(0,-2,width,32)];
  4. 这会让问题消失(对我而言)。

    我认为错误/问题与绘制时垂直缩放而不是有关,因此我强制缩放第一个源图像行(分为两行),这是在我的构图之外绘制的。

    我希望这可以帮助别人节省5个小时。

    / Krisb

答案 4 :(得分:0)

我停止使用stretchableImageWithLeftCapWidth来支持UIView更加良好的contentStretch属性。我从未见过你描述的绿色条形图,但总的来说我建议使用contentStretch而不是stretchableImageWithLeftCapWidth。

答案 5 :(得分:0)

我试图像Nate提议的那样禁用PNG压缩,但这对我不起作用(iOS 3.1.3)。然后我尝试使用TIFF图像而不是PNG,它可以工作。

答案 6 :(得分:0)

当使用值(0.5,0.5,0,0)时,我发现contentStretch(在任何已绘制内容的UIView上)存在类似问题。即在中心像素上拉伸。

我发现只有iphone 3G(可能是2G)才会出现这个问题。 iphone 4和3GS还可以。所以,我认为这是旧图形硬件的一个问题。

我发现问题的一个方法是在稍大的中心区域伸展。

e.g。 (0.4,0.4,0.1,0.1)