Подтвердить что ты не робот

Изменение размера UIImageView для соответствия изображению с помощью AutoLayout

Я хочу изменить высоту/ширину UIImageView в соответствии с изображением, которое я выбрал из фотоальбома, и нашел здесь фрагмент, который делает это.

-(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);
  }
}

Проблема в том, что она меняет высоту/ширину UIImageView, когда я вызываю ее с помощью кнопки

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

Но я хочу, чтобы он сделал это, как только я выбрал изображение из фотоальбома, и вот как я его настроил.

-(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];
}
4b9b3361

Ответ 1

Решение автоматической компоновки

С тех пор, как вы установили, что используете свой автоматический макет в своем проекте, я сделал демонстрационное приложение, чтобы показать вам, как вы можете изменить образ изображения и настроить высоту. Автоматический макет сделает это автоматически, но уловка заключается в том, что фотография, которую вы будете использовать, поступает из галереи пользователей, и поэтому они, вероятно, будут очень большими и это.

Итак, проверьте приложение: https://bitbucket.org/danielphillips/auto-layout-imageview

Трюк заключается в создании ссылки на NSLayoutConstraint высоты представления изображения. Когда вы меняете свое изображение, вам нужно отрегулировать его постоянным до нужной высоты с учетом фиксированной ширины.

Другим решением может быть установка contentMode в вашем представлении изображения, с помощью UIViewContentModeScaleAspectFit ваше изображение будет всегда отображаться в полном объеме, но будет заблокировано до границ изображения, которое может измениться на основе Auto Ограничения макета, которые у вас есть.

Начальный ответ

Похоже, вы действительно слишком усложнили это, если я не пропустил что-то.

Когда вы получаете новое изображение из подборщика изображений, все, что вам нужно сделать, это изменить кадр изображения в соответствии с размером 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];
}

Конечно, это будет потенциально очень большой (он использует исходное изображение, которое может быть очень большим).

Итак, давайте заблокируем ширину до 280 точек... таким образом, мы всегда можем иметь полное изображение на экране в портретном режиме.

Таким образом, если ваш размер изображения составляет 1000x800, и наш образ изображения может быть 280x100. Мы можем рассчитать правильную высоту изображения, сохраняя ширину изображения таким образом:

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);

Ответ 2

Вот класс Swift, который поможет вернуть правильный размер для изображения на основе ширины или высоты, которые вы выберете:

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
}