web-dev-qa-db-fra.com

Comment faire pour redimensionner automatiquement UIImageView à la taille de l'image chargée

J'ai mis un contrôle UIImageView sur ma vue avec IB. La taille du contrôle est juste quelque chose que j'ai décidé, une taille assez aléatoire Ce que je veux faire, c'est que le contrôle se redimensionne automatiquement chaque fois que je définis la propriété image sur une nouvelle image. Je veux qu'il redimensionne réellement à la taille de l'image. Peut-il être fait automatiquement? sans aucune intervention de code? Sinon - quelle sera la meilleure approche dans ce cas?

Ce qui se passe aujourd'hui est étrange. Je charge des images dans ImageView et je vois que les images s'affichent correctement même si la taille de ImageView n'est pas modifiée. Cela interfère avec mon intention de saisir les contacts des utilisateurs sur ImageView. L'utilisateur touche l'image réelle, mais comme certaines parties de l'image sont à l'extérieur (et c'est la partie étrange) du mappage des points ImageView, cela devient fou. Quelqu'un peut-il penser à une explication à cela?

merci

20
Louis Shraga

La taille d'une image n'a aucune incidence sur la taille réelle de UIImageView, mais la taille de UIImageView dépend uniquement de la taille qui lui est donnée dans Interface Builder (ou que vous lui avez affectée). Sinon, les images seraient toutes dingues lorsque vous utilisez les images @ 2x pour les écrans Retina par exemple.

Si vous souhaitez résoudre ce problème, vous devez également modifier le cadre lors de la définition de l'image. Si vous faites cela maintenant:

[imageView setImage:[UIImage imageNamed:@"myImage.jpg"]];

changez-le en:

UIImage img = [UIImage imageNamed:@"myImage.jpg"];
[imageView setImage:img];
imageView.frame = CGRectMake(imageView.frame.Origin.x, imageView.frame.Origin.y,
                             img.size.width, img.size.height);

Cela ne changera cependant pas la disposition de la vue dans laquelle il est contenu, vous pouvez le faire changer automatiquement la taille des autres vues sous iOS 6 en utilisant des contraintes de disposition. Si vous êtes un développeur Apple vous pouvez regarder les vidéos d'instructions de la WWDC, ils expliquent comment ce système fonctionne assez bien.

Si la vue ne s'agrandit pas et que le problème vient de la façon dont l'image déborde de ses limites lorsque vous la changez en une image qui ne correspond pas à la dimension de la vue contenant, vous pouvez définir la case à cocher "Clip Subviews" dans l'interface Générateur pour la vue d'image. Cela fera en sorte que la vue ne dessine rien en dehors de son propre cadre de délimitation, si vous définissez également le mode de mise à l'échelle sur "Remplissage aspect" ou "Échelle à remplir", l'image remplira toujours toutes les limites de la vue contenant .

26
Hampus Nilsson

Voici l'extrait de code que je coupe et colle souvent, en utilisant la même méthode que Hampus Nilsson ci-dessus -

Exemple

func demo(x0:CGFloat, y0:CGFloat) {
    let imgView = UIImageView(image: UIImage(named: "someImg.png"));
    imgView.sizeToImage();
    imgView.center = CGPoint(x:x0, y:y0);
}

Extension UIImageView

extension UIImageView {

/******************************************************************************/
/** @fcn        sizeToImage()
 *  @brief      size view to image
 *  @@assum     (image!=nil)
 */
/******************************************************************************/
func sizeToImage() {

    //Grab loc
    let xC = self.center.x;
    let yC = self.center.y;

    //Size to fit
    self.frame  = CGRect (x: 0, y: 0, width: (self.image?.size.width)!/2, height: (self.image?.size.height)!/2);

    //Move to loc
    self.center = CGPoint(x:xC, y:yC);

    return;
}

Un merveilleux couper-coller, utilisez si nécessaire!

1
J-Dizzle