2009-11-01 7 views
4

J'ai un UIImageView montrant une image qui est plus grande que son cadre.
Il est configuré pour redimensionner l'image en fonction de son cadre. Mais, l'image est mise à l'échelle avec un filtre de basse qualité.Cocoa-Touch: Comment définir la qualité d'interpolation à utiliser par un UIImageView?

J'ai read here que cela est causé par une faible qualité d'interpolation. Comment puis-je obtenir son contexte pour CGContextSetInterpolationQuality à kCGInterpolationHigh?

Répondre

1

UIImageView ne propose pas cette fonctionnalité, si UIImage a une méthode _imageScaledToSize:interpolationQuality: non documentée si je me souviens bien.

Étant donné que UIImageView dessine directement à l'affichage, le sous-classement et le remplacement drawRect: ne sont pas une option (merci à Prody de le signaler). La seule option que je vois est de créer une sous-classe UIView personnalisée avec une implémentation personnalisée drawrect:.

+0

A partir des docs: La classe UIImageView est optimisée pour dessiner ses images à l'écran. UIImageView n'appellera pas drawRect :. Je ne trouve aucune mention de _imageScaledToSize: interpolationQuality. Je suppose que pour l'instant je vais dessiner mon image dans le drawRect de la vue parente. – Prody

+0

Merci pour la correction, Prody. J'aurais dû lire les docs avant de poster. Je vais modifier ma réponse en conséquence. –

1

CGContextSetInterpolationQuality est une fonction. Vous devez l'appeler avec tous les paramètres appropriés à votre situation.

http://developer.apple.com/mac/library/qa/qa2001/qa1186.html

+0

Et où appelez-vous cette fonction pour l'appliquer au dessin de UIImageView? –

+1

Je dessiner l'image dans un nouveau contexte en utilisant ce paramètre, prendre le UIImage résultant, et définir la propriété UIImageView.image à l'image raffinée. –

2

De « UIImageView scaling/interpolation », c'est la façon la plus rationnelle de le faire si vous le pouvez:

[[yourimageview layer] setMagnificationFilter:kCAFilterTrilinear] 

Assurez-vous de #import <QuartzCore/CALayer.h>

Un avertissement sur kCAFilterTrilinear: « Certains équarrisseurs peuvent ignorer, ou imposer des restrictions supplémentaires, telles que des images source nécessitant une puissance de deux dimensions. "