3

イメージをロードし、この方法でミラーを作成します。

 originalImg = [UIImage imageNamed:@"ms06.png"];
 mirrorImg = [UIImage imageWithCGImage:[originalImg CGImage] scale:1.0 orientation:UIImageOrientationUpMirrored];

次に、上記の UIImage オブジェクトを UIView のサブクラスに設定し、drawRect をオーバーライドします。

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGAffineTransform t0 = CGContextGetCTM(context);
    CGContextConcatCTM(context, t0);

    CGContextDrawImage(context, self.bounds, [image CGImage]);
    CGContextRestoreGState(context);
}

どの画像を描いても、表示される画像は常に元の画像であり、UIView サブクラスに設定するとミラーリングされた画像は表示されませんでした。ミラーリングされたイメージが UIView に正しく設定されたことは確かです。なぜなら、元のイメージが 0 に等しいのに対し、向きのメンバー変数が 4 に等しいことがデバッグ情報に示されているためです。 、 ありがとう。

また、setImage: を使用して UIImageView に鏡像を表示しようとしましたが、正しく動作します。ところで、UIImageView の setImage を呼び出したときに drawRect のブレークポイントがヒットしないことがわかりましたが、UIImageView に画像をロードするときの描画動作 (画像の上に線を引くなど) を定義するにはどうすればよいでしょうか?

4

1 に答える 1

1

UI レベルで画像をミラーリングします。これは新しい UIImage を返しますが、CGImage は同じままです。NSLog を実行すると、これに気付くでしょう。

UI レベルで変換を行うこともできます。このアプローチを使用する場合は、1.0 の代わりに originalImg.scale を使用することをお勧めします。その後、コードは網膜ディスプレイと非網膜ディスプレイで機能します。

[UIImage imageWithCGImage:[originalImg CGImage] scale:originalImg.scale orientation:UIImageOrientationUpMirrored];

CGImage をミラーリングする必要がある場合は、GitHub の NYXImagesKit を参照してください (UIImage+Rotating.m を参照)。

于 2013-02-06T08:38:25.477 に答える