iPhone图像失真

时间:2009-01-24 16:40:24

标签: iphone cocoa-touch quartz-graphics

有没有理由为什么模拟器会正确显示UIImageViews,但在iPhone上显示不正确?

我的流程: PNG文件中的图像 启动UIGraphicsBeginImageContext() 在CGrect中绘制PNG 在CGRect中绘制文本 从上下文创建UIImage 将UIImaveView的图像设置为UIImage 将UIImageView的框架设置为PNG的大小 添加为子视图

结果: 图像无法正确显示。最右边1-3个像素的图像只是一条垂直的白线。这仅在设备上发生,而不在模拟器上发生。我可以解决这个问题,但只能增加UIImageView的大小。如果我将UIImageView的size.height增加1个像素,它会正确显示UIImage。当然,这些会让iPhone在将图像绘制到屏幕上之前对其进行缩放,这是不可取的。

为什么会出现这种情况或对其进行修复的任何想法? (如果需要,我会发布我的代码)

4 个答案:

答案 0 :(得分:2)

以下是获取我的PNG文件,使用文本绘制并保存为UIImage的代码。然后将此图像设置为UIImageView的图像属性,其帧大小为图像的大小(25x25)。

-(UIImage *) elementImageWithFrame: (CGRect) aFrame image: (NSString *) anImage{


        int smallFontSize=FONT_SMALL;
        int largeFontSize=FONT_LARGE;

        CGSize mySize = aFrame.size;

        UIGraphicsBeginImageContext(mySize);

        UIImage *backgroundImage = [UIImage imageNamed:anImage];
        CGRect elementSymbolRectangle = CGRectMake(0.0f ,0.0f, aFrame.size.width, aFrame.size.height);
        [backgroundImage drawInRect:elementSymbolRectangle];

        // draw the element name
        [[UIColor whiteColor] set];

        // draw the element number
        UIFont *font = [UIFont boldSystemFontOfSize:(smallFontSize)];
        CGPoint point = CGPointMake(2,1);
        [self.atomicNumber drawAtPoint:point withFont:font];

        // draw the element symbol

        font = [UIFont boldSystemFontOfSize:largeFontSize];
        CGSize stringSize = [self.symbol sizeWithFont:font];
        point = CGPointMake((elementSymbolRectangle.size.width-stringSize.width)/2,aFrame.size.height-(largeFontSize)-(largeFontSize/10));
        [self.symbol drawAtPoint:point withFont:font];

        //get image


        UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();

            return (theImage);
    }

答案 1 :(得分:1)

得到了它!

以下是我击败SDK的方法。

由于某种原因,A UIImageView不喜欢UIGraphicsBeginImageContext生成的图像。所以相反,我改变了我的类作为标准UIView(而不是UIImageView)的子类。然后我实现了drawRect方法。在drawRect方法中,我将相同的代码放在UIGraphicsBeginImageContext块中。

由于某种原因,此代码在drawRect方法中正确呈现图像,但在UIGraphicsBeginImageContext中没有(可能是一个bug,可能是我)。

代码如下。

- (void)drawRect:(CGRect)rect {


    UIImage *backgroundImage = [UIImage imageNamed:imageFile];
    CGRect elementSymbolRectangle = CGRectMake(0.0f ,0.0f, backgroundImage.size.width, backgroundImage.size.height);
    [backgroundImage drawInRect:elementSymbolRectangle];

    // draw the element name
    [[UIColor whiteColor] set];

    // draw the element number
    UIFont *font = [UIFont boldSystemFontOfSize:(smallFontSize)];
    CGPoint point = CGPointMake(2,1);
    [self.atomicNumber drawAtPoint:point withFont:font];

    // draw the element symbol

    font = [UIFont boldSystemFontOfSize:largeFontSize];
    CGSize stringSize = [self.symbol sizeWithFont:font];
    point = CGPointMake((elementSymbolRectangle.size.width-stringSize.width)/2,self.frame.size.height-(largeFontSize)-(largeFontSize/10));
    [self.symbol drawAtPoint:point withFont:font];

}

(此外,此代码可在Apple示例代码:theElements中找到)

答案 2 :(得分:0)

您是否检查过UIImageView的缩放/调整大小选项?

答案 3 :(得分:0)

我对drawInRect和CGContextDrawImage都有类似的问题,最右边2个像素变成白色或以某种方式反转。解决方案是使用不使用alpha通道的PNG图像。