我有一个显示在由 UIScrollView 控制的 UIView 中的 CGImage。图像通常是 1680*1050 的 24 位颜色,没有 Alpha 通道。
图像是这样创建的:
CGImageRef bitmapClass::CreateBitmap(int width, int height, int imageSize, int colorDepth, int bytesPerRow)
{
unsigned char* m_pvBits = malloc(imageSize);
// Initializt bitmap buffer to black (red, green, blue)
memset(m_pvBits, 0, imageSize);
m_DataProviderRef =
CGDataProviderCreateWithData(NULL, m_pvBits, imageSize, NULL);
m_ColorSpaceRef =
CGColorSpaceCreateDeviceRGB();
return
CGImageCreate(width, height,
8, //kBitsPerComponent
colorDepth,
bytesPerRow,
m_ColorSpaceRef,
kCGBitmapByteOrderDefault | kCGImageAlphaNone,
m_DataProviderRef,
NULL, false, kCGRenderingIntentDefault);
}
图像内容通过更改 m_pvBits 中的像素在后台定期更新,并使用以下方法在 UIView 中更新:
[myView setNeedsDisplayInRect:rect];
这会调用 drawRect 来显示图像,如下所示:
- (void)drawRect:(CGRect)rect
{
CGRect imageRect;
imageRect.origin = CGPointMake(0.0, 0.0);
imageRect.size = CGSizeMake(self.imageWidth, self.imageHeight);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetInterpolationQuality(context, kCGInterpolationNone);
// Drawing code
CGContextDrawImage(context, imageRect, (CGImageRef)pWindow->GetImageRef());
}
只要视图没有缩小(缩小),这种方法就可以很好地工作。我知道'rect'实际上并没有直接在drawRect中使用,但'context'似乎知道CGContextDrawImage应该更新屏幕的哪个部分。
我的问题是,即使我只使用 setNeedsDisplayInRect 使屏幕的一小部分区域无效,但当视图缩小时,整个屏幕都会调用 drawRect。因此,如果我的图像是 1680*1050 并且我使一个小矩形 (x,y,w,h)=(512, 640, 32, 32) 无效,则使用 (x,y,w,h)=(0 , 0, 1680, 1050)。
为什么?