UIScrollView によって制御される UIView に表示される CGImage があります。画像は通常、アルファ チャネルなしの 24 ビット カラーで 1680*1050 です。
イメージは次のように作成されます。
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で直接使用されていないことは知っていますが、「コンテキスト」は画面のどの部分をCGContextDrawImageで更新する必要があるかを知っているようです。
私の問題は、setNeedsDisplayInRect で画面の小さな領域のみを無効にしていても、ビューが縮小されると画面全体で drawRect が呼び出されることです。したがって、画像が 1680*1050 で、小さな四角形 (x,y,w,h)=(512, 640, 32, 32) を無効にする場合、drawRect は (x,y,w,h)=(0 で呼び出されます。 、0、1680、1050)。
なんで?