iPhone画像の歪み
-
20-08-2019 - |
質問
シミュレーターがUIImageViewを適切に表示するが、iPhoneで正しく表示されない理由はありますか?
私のプロセス: PNGファイル内の画像 UIGraphicsBeginImageContext()を開始します PNGをCGrectで描画します CGRectにテキストを描画します コンテキストからUIImageを作成します UIImaveViewの画像をUIImageに設定します UIImageViewのフレームをPNGのサイズに設定します サブビューとして追加
結果: 画像が正しく表示されません。画像の右から1〜3ピクセルは、垂直の白い線です。これはデバイスでのみ発生し、シミュレータでは発生しません。この問題は修正できますが、UIImageViewのサイズを大きくするだけです。 UIImageViewのsize.heightを1ピクセル増やすと、UIImageが正しく表示されます。もちろん、これらは画面に描画する前に画像をスケーリングするためにiPhoneを残します。これは望ましくありません。
これが発生する理由や修正方法はありますか? (必要に応じてコードを投稿します)
解決 2
Got IT!
SDKに勝つ方法は次のとおりです。
何らかの理由で、UIImageViewはUIGraphicsBeginImageContextによって生成される画像を好みません。そのため、代わりに標準UIView(UIImageViewではない)のサブクラスとしてクラスを変更しました。次に、drawRectメソッドを実装しました。 drawRectメソッド内で、UIGraphicsBeginImageContextブロックに同じコードを配置しました。
何らかの理由で、このコードはdrawRectメソッドで画像を適切に描画しますが、UIGraphicsBeginImageContextでは描画しません(バグの可能性があります、私かもしれません)。
コードは次のとおりです。
- (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にあります)
他のヒント
ここに、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);
}
UIImageViewのスケーリング/サイズ変更オプションをチェックしましたか?
drawInRectとCGContextDrawImageの両方で同様の問題が発生しました。右端の2ピクセルが白になるか、何らかの方法で反転します。解決策は、アルファチャネルを使用しないPNG画像を使用することでした。