代码之家  ›  专栏  ›  技术社区  ›  Stephan Burlot

使用LeftCapWidth调整可拉伸图像的大小

  •  7
  • Stephan Burlot  · 技术社区  · 17 年前

    我正在尝试使用LeftCapWidth的可伸缩图像调整图像的大小:它在模拟器上工作,但在设备上,垂直的绿色条出现。

    我试过使用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 回复  |  直到 16 年前
        1
  •  12
  •   Nate Weiner    16 年前

    你知道吗?

    似乎是uigraphicsGetImageFromCurrentImageContext的错误。如果我画一个具有透明度的图像,我会得到红色/绿色的伪影。这些仅出现在设备上(而不是SIM卡中)。另外,如果我从图像中去除透明度,这些伪影就会消失。

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

    胜利!找到一个解决方案:

    在项目的生成设置中关闭“压缩PNG文件”。禁用此选项将使PNG透明性在没有任何瑕疵的情况下工作。

        2
  •  5
  •   Chris Garrett    17 年前

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

    要获取图像:

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

    您要在代码的哪个部分显示此图像?也就是说,你用什么方法来画上面的图像?

    为什么不使用uiImageView并将图像放入其中?然后你不需要做任何图像上下文绘制等。

        3
  •  1
  •   Henrik Strand    16 年前

    在我的例子中,我有一个水平伸展的uiImageView。我在拉伸的图像中发现了一条奇怪的垂直白线。

    上面的解决方案对我不起作用。但是,以下情况确实发生了:

    将宽度值强制转换为int值:

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

    希望对你们也有用…

        4
  •  0
  •   user251412    16 年前

    我昨晚花了5个小时调试,禁用xcode中的png压缩对我没有任何帮助。

    对于其他任何人,遇到垂直、绿色、条形/线条/具有leftcapwidth的可伸缩图像的工件(在uiimage api中)-这篇文章是为您准备的。

    我有一个21x30的自定义barbutton背景,我想扩大,但得到了相同的绿色条纹作为行动。我发现了一个PNG与photoshop创建和工作良好-我的是与gimp。 无论如何,从文件中剥离所有块(除了三个基本块)没有什么区别。也没有禁用PNG压缩。

    我的工作是:

    1. 在我的图像上方添加一行空行(现在是21x31)。
    2. 创建缩放图像时,将TopCapHeight设置为0。
    3. 当我使用缩放后的图像时,我将绘制成一个cgContext,该cgContext稍后用于生成uiimage。我用这个画: [图像绘制:CGrectmake(0,-2,宽度,32)]

    这使问题(对我)消失了。

    我认为错误/问题与 不 绘制时垂直缩放,所以我强制缩放第一条源图像线(两条线),这条线在合成图之外绘制。

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

    克里斯布

        5
  •  0
  •   Rolf Hendriks    16 年前

    我停止使用StretchableImageWithLeftCapWidth,转而使用uiView行为更为良好的ContentStretch属性。我从来没有见过您描述的绿色条,但一般来说,我建议使用ContentStretch而不是LeftCapWidth的可伸缩图像。

        6
  •  0
  •   ryyst    16 年前

    我试着像内特建议的那样禁用PNG压缩,但这对我不起作用(IOS3.1.3)。然后我尝试使用TIFF图像而不是PNG,这很有效。

        7
  •  0
  •   Nick Hingston    16 年前

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

    我发现只有iPhone3G(可能是2G)才会出现这个问题。iPhone4和3GS正常。所以,我假设这是旧图形硬件的问题。

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

    例如(0.4、0.4、0.1、0.1)