web-dev-qa-db-fra.com

Modifier la taille UIImageView pour faire correspondre l'image avec la mise en page automatique

Je veux modifier ma hauteur/largeur UIImageView pour qu'elle corresponde à l'image que je choisis dans l'album photo et j'ai trouvé un extrait ici qui fait cela.

-(CGRect)frameForImage:(UIImage *)imgs inImageViewAspectFit:(UIImageView *)imagev
{
  float imageRatio = imgs.size.width / imgs.size.height;
  float viewRatio = imagev.frame.size.width / imagev.frame.size.height;
  if(imageRatio < viewRatio)
  {
    float scale = imagev.frame.size.height / imgs.size.height;
    float width = scale * imgs.size.width;
    float topLeftX = (imagev.frame.size.width - width) * 0.5;
    NSLog(@"image after aspect fit: width=%f",width);
    imagev.frame = CGRectMake(topLeftX, 0, width, imagev.frame.size.height);
    return CGRectMake(topLeftX, 0, width, imagev.frame.size.height);
  }
  else
  {
    float scale = imagev.frame.size.width / imgs.size.width;
    float height = scale * imgs.size.height;
    float topLeftY = (imagev.frame.size.height - height) * 0.5;
    NSLog(@"image after aspect fit: height=%f", height);
    imagev.frame = CGRectMake(0, topLeftY, imagev.frame.size.width, height);
    return CGRectMake(0, topLeftY, imagev.frame.size.width, height);
  }
}

Le problème est qu'il change la hauteur/largeur UIImageView lorsque je l'appelle à partir d'un bouton

- (IBAction)changeSize:(id)sender
{
  [self frameForImage:image inImageViewAspectFit:self.imageView];    
}

Mais je veux qu'il le fasse dès que je choisis une image de l'album photo et c'est ainsi que je l'ai configurée.

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  image = [info objectForKey:UIImagePickerControllerOriginalImage];
  [self.imageView setImage:image];
  [self frameForImage:image inImageViewAspectFit:self.imageView];
  [self dismissViewControllerAnimated:YES completion:NULL];
}
18
Mike Tyson

Solution de mise en page automatique

Depuis que vous avez établi que vous utilisez la mise en page automatique dans votre projet, j'ai créé une application de démonstration pour vous montrer comment vous pouvez changer l'image de la vue d'image et régler la hauteur. La mise en page automatique le fera automatiquement pour vous, mais le problème est que la photo que vous utiliserez provient de la galerie des utilisateurs et qu'ils sont donc susceptibles d'être très gros et cela.

Consultez donc l'application: https://bitbucket.org/danielphillips/auto-layout-imageview

L'astuce consiste à créer une référence de NSLayoutConstraint de la hauteur de la vue de l'image. Lorsque vous changez votre image, vous devez ajuster sa constante à la bonne hauteur compte tenu de la largeur fixe.

Votre autre solution pourrait être de définir un contentMode sur votre vue d'image, en utilisant UIViewContentModeScaleAspectFit votre image apparaîtra toujours en entier mais sera verrouillée sur les limites de la vue d'image, qui peut changer en fonction sur les contraintes de disposition automatique que vous avez.

Réponse initiale

Il semble que vous ayez vraiment trop compliqué cela, sauf si j'ai raté quelque chose.

Lorsque vous obtenez une nouvelle image à partir du sélecteur d'images, tout ce que vous avez à faire est de modifier le cadre de la vue d'image en fonction de la taille UIImage.

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
  image = [info objectForKey:UIImagePickerControllerOriginalImage];
  [self.imageView setImage:image];
  self.imageView.frame = CGRectMake(self.imageView.frame.Origin.x
                                    self.imageView.frame.Origin.y
                                    image.size.width
                                    image.size.height);
  [self dismissViewControllerAnimated:YES completion:NULL];
}

Bien sûr, cela va être potentiellement très grand (il utilise l'image d'origine qui peut être très grande).

Alors verrouillons la largeur à 280 points ... de cette façon, nous pouvons toujours avoir l'image complète à l'écran en mode portrait.

Donc, en supposant que la taille de votre image est de 1000x800, et notre vue d'image est peut-être 280x100. Nous pouvons calculer la hauteur correcte pour la vue d'image en conservant la largeur de la vue d'image comme ceci:

CGSize imageSize        = CGSizeMake(1000.0, 800.0);
CGSize imageViewSize    = CGSizeMake(280.0, 100.0);

CGFloat correctImageViewHeight = (imageViewSize.width / imageSize.width) * imageSize.height;

self.imageView.frame = CGRectMake(  self.imageView.frame.Origin.x,
                                    self.imageView.frame.Origin.x,
                                    CGRectGetWidth(self.imageView.bounds),
                                    correctImageViewHeight);
32
Daniel

Voici une classe Swift qui aidera à retourner le bon dimensionnement pour une image en fonction d'une limite de largeur ou de hauteur que vous choisissez:

class func returnImageSizeForHeightLimit(heightLimit:CGFloat?, orWidthLimit widthLimit:CGFloat?, forImage theImage:UIImage)->CGSize?{

    if let myHeightLimit = heightLimit {

        let theWidth = (myHeightLimit/theImage.size.height) * theImage.size.width

        return CGSizeMake(theWidth, myHeightLimit)
    }

    if let myWidthLimit = widthLimit {

        let theHeight = (myWidthLimit/theImage.size.width) * theImage.size.height

        return CGSizeMake(myWidthLimit, theHeight)
    }

    return nil
}
5
PJeremyMalouf