2016-08-29 4 views
0

を適用した後、私はUIViewの祖先を持っている - このビューには、いくつかの点で両方の方向にスケーリングされた画像削除品質負けスケールは

override func draw(_ rect: CGRect) { 
    super.draw(rect) 

    image?.draw(in: rect) 

    /*some code here*/ 
} 

を表示する-drawInRectメソッドをオーバーライドMYVIEWを、言ってみましょう。拡大後、表示される画像の品質が失われます。私がサイズ20 * 20のMyViewを作成した場合、スケーリング後にboundsプロパティは同じままですが、私が同じ20x20サイズでペイントしようとしているので、私が表示しようとしている変換イメージは低品質です。ビューのスケーリングにそれぞれイメージを描画する方法はありますか?

+0

私はビュー自体ではなく、MyViewスーパービューをスケールします。 –

答えて

0

まず、適度に複雑な画像描画を自分で実装しようとするよりも、サブビューとしてUIImageViewを使用することを強く検討してください。 UIImageViewは、直面する多くの問題に最適化されています。それは完璧ではないし、あなたが何をしているのかを知っているなら手でもっとうまくいくこともあるかもしれないが、それはうまくいく。

具体的な問題として、contentModeはほぼ確実にscaleToFill(これがデフォルトです)です。最も簡単な解決策は、境界を変更したときに完全な再描画を強制するには、redrawに変更することです。それは非常に効率的ではありませんが、あなたの問題では大丈夫かもしれません(それはしばしば問題ありません)。それを高品質のものにすることは、もう少し複雑であり、しばしばあなたのアプリケーションがどのように動作するかについて多くの特別な知識を必要とします。簡単なケースでは、これを高品質かつ効率的にすることは、UIImageViewがあなたのために行うものです。

20x20から他の特定のサイズに確実に拡大縮小する場合、ビューがあまりにも多くない場合は、フルサイズで描画し、から20x20にスケールします。これは非常にです。多くのビューがあり、最終イメージのサイズが大きい場合、非常に高速で高品質なので、少なくとも考慮する必要がある場合は非効率です。私は小さなズーム(例えば110%のサイズ)を扱うためにこれをしました。ただし、サムネイルをフルスクリーンイメージにするのは良い方法ではないでしょう。

+0

UIImageViewは私にとっては適していません。なぜなら、drawInRectのblendMode + fillColorによって非透明ピクセルにダークオーバーレイを追加するからです。私が言ったように、境界は変更されないので、contentModeを持つソリューションは機能しません。変換のみ スケーリングは現在の解決策ですが、最も効率的ではありません。 –

関連する問題