3

現在、作成したメニューに 2 つの画像を使用しています。少し前にこのコードを通常のディスプレイ システムに使用していましたが、正常に動作していました。Retina ディスプレイでは、CGImageRef がバックグラウンド ディスプレイの押下時に適切なマスクされた画像を作成するという問題が発生しています。網膜画像の画像拡張機能を使用してインポートを試みました。画像は以下を使用して提供されます。

[UIImage imageNamed:@"filename.png"]

filename.png と filename@2x.png の両方の名前を持つ標準イメージと網膜イメージの両方を提供しました。

問題は、選択した領域のマスクを選択するときに発生します。コードは、低解像度のリソースと高解像度のメイン リソースで正常に動作しますが、使用すると

CGImageCreateWithImageInRect

画像を作成する範囲を指定すると、画像のスケールが大きくなります。つまり、メイン ボタンの解像度は良好ですが、ボタンを押したときに返されて重ね合わされる画像は正しい解像度ではなく、奇妙に 2 倍にスケーリングされます。ひどく見えるピクセル密度。

私は両方を試しました

    UIImage *img2 = [UIImage imageWithCGImage:cgImg scale:[img scale] orientation:[img imageOrientation]];
    UIImage *scaledImage = [UIImage imageWithCGImage:[img2 CGImage] scale:4.0 orientation:UIImageOrientationUp];

そして、画像を取得して drawInRect:(Selected Rect) を取得すると、どこにも行かないようです

私は今、約2時間髪を引き裂いていますが、適切な解決策が見つからないようです。誰かアイデアはありますか?

4

1 に答える 1

16

この場合、何をする必要があるかを理解しました。プレスされた状態の画像を作成するときに画像のスケールを考慮に入れるヘルパー メソッドを作成し、そのように画像スケールで CGRect をスケーリングしました。

- (UIImage *)imageFromImage:(UIImage *)image inRect:(CGRect)rect {
rect.size.height = rect.size.height * [image scale];
rect.size.width = rect.size.width * [image scale];
rect.origin.x = rect.origin.x * [image scale];
rect.origin.y = rect.origin.y * [image scale];
CGImageRef sourceImageRef = [image CGImage];
CGImageRef newImageRef = CGImageCreateWithImageInRect(sourceImageRef, rect);
UIImage *newImage = [UIImage imageWithCGImage:newImageRef scale:[image scale] orientation:[image imageOrientation]];
CGImageRelease(newImageRef);
return newImage;
}

これにより、マッピングに関して同様の問題を抱えている人は誰でも修正できるはずです。

于 2011-02-21T01:35:21.227 に答える