Как получить размер масштабированного UIImage в UIImageView?

Атрибут image.sizeUIImageView дает размер исходного UIImage. Я хотел бы узнать размер автомасштабируемого изображения, когда оно вставлено в UIImageView (обычно меньше оригинала).

Например, у меня установлен образ Aspect Fit. Теперь я хочу узнать его новую высоту и ширину на экране, чтобы я мог точно рисовать на новом масштабированном изображении.

Есть ли способ сделать это, не выясняя это сам, основываясь на размере UIImageView и исходном размере UIImage (в основном, обратное проектирование его масштабирования)?

возникла такая же проблема, возможно, мне нужно будет рассчитать размер самостоятельно ...

negersiu 26.01.2011 10:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
1
29 346
9

Ответы 9

Как насчет того, чтобы просто получить размер UIImageView из его фрейма? то есть imageView.frame?

image.frame.size - это текущий размер этого представления в системе координат супервизора, который равен наверное, измеренный в пикселях.

sirwart 31.12.2008 03:15

Если рамка заполнена с сохранением соотношения сторон изображения, рамка просмотра изображения не будет такой же, как размер изображения.

Поскольку у вас есть представление изображения, установленное на Aspect Fit, вы можете просто взять высоту и ширину представления изображения вместе с высотой и шириной исходного изображения и вычислить высоту и ширину масштабированного изображения.

Тем не менее, способ лучше сделать это - иметь настраиваемое представление вместо UIImageView. Затем нарисуйте изображение самостоятельно в пользовательском представлении. Таким образом, вы можете контролировать каждый его аспект.

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

Dal 17.07.2017 03:03

Цель-C:

-(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView
{
    float imageRatio = image.size.width / image.size.height;
    float viewRatio = imageView.frame.size.width / imageView.frame.size.height;
    if (imageRatio < viewRatio)
    {
        float scale = imageView.frame.size.height / image.size.height;
        float width = scale * image.size.width;
        float topLeftX = (imageView.frame.size.width - width) * 0.5;
        return CGRectMake(topLeftX, 0, width, imageView.frame.size.height);
    }
    else
    {
        float scale = imageView.frame.size.width / image.size.width;
        float height = scale * image.size.height;
        float topLeftY = (imageView.frame.size.height - height) * 0.5;

        return CGRectMake(0, topLeftY, imageView.frame.size.width, height);
    }
}

Swift 4:

func frame(for image: UIImage, inImageViewAspectFit imageView: UIImageView) -> CGRect {
  let imageRatio = (image.size.width / image.size.height)
  let viewRatio = imageView.frame.size.width / imageView.frame.size.height
  if imageRatio < viewRatio {
    let scale = imageView.frame.size.height / image.size.height
    let width = scale * image.size.width
    let topLeftX = (imageView.frame.size.width - width) * 0.5
    return CGRect(x: topLeftX, y: 0, width: width, height: imageView.frame.size.height)
  } else {
    let scale = imageView.frame.size.width / image.size.width
    let height = scale * image.size.height
    let topLeftY = (imageView.frame.size.height - height) * 0.5
    return CGRect(x: 0.0, y: topLeftY, width: imageView.frame.size.width, height: height)
  }
}

Если переданное изображение могло содержать 0 высоты или 0 ширины, сгенерированный CGRect мог бы содержать NaN. Будьте осторожны, если это произойдет.

Wayne Liu 02.04.2014 12:59

Этот ответ меня просто порадовал. Спасибо! :-D

Oscar Swanros 17.06.2014 00:02

Это идеальное решение ... отличное мышление .. !! всего наилучшего и спасибо.

Revanth 05.09.2014 20:12

ты спаситель моего дня. Спасибо ! :)

hkaraoglu 18.08.2016 10:19

Работаю именно я и ожидал. Спасибо

Warewolf 11.11.2016 08:14

Эта простая функция рассчитает размер изображения после подгонки соотношения сторон:

-(CGSize)imageSizeAfterAspectFit:(UIImageView*)imgview{


    float newwidth;
    float newheight;

    UIImage *image=imgview.image;

    if (image.size.height>=image.size.width){
        newheight=imgview.frame.size.height;
        newwidth=(image.size.width/image.size.height)*newheight;

        if (newwidth>imgview.frame.size.width){
            float diff=imgview.frame.size.width-newwidth;
            newheight=newheight+diff/newheight*newheight;
            newwidth=imgview.frame.size.width;
        }

    }
    else{
        newwidth=imgview.frame.size.width;
        newheight=(image.size.height/image.size.width)*newwidth;

        if (newheight>imgview.frame.size.height){
            float diff=imgview.frame.size.height-newheight;
            newwidth=newwidth+diff/newwidth*newwidth;
            newheight=imgview.frame.size.height;
        }
    }

    NSLog(@"image after aspect fit: width=%f height=%f",newwidth,newheight);


    //adapt UIImageView size to image size
    //imgview.frame=CGRectMake(imgview.frame.origin.x+(imgview.frame.size.width-newwidth)/2,imgview.frame.origin.y+(imgview.frame.size.height-newheight)/2,newwidth,newheight);

    return CGSizeMake(newwidth, newheight);

}

Эта простая функция рассчитает размер изображения: -

[imageView setFrame:AVMakeRectWithAspectRatioInsideRect(image.size, imageView.frame)];

Для более подробной информации Вы можете обратиться к AVMakeRectWithAspectRatioInsideRect - AVFoundation.

это определенно лучший ответ! Я не знал об этой функции, большое спасибо;)

polo987 09.02.2016 13:22

Адаптация cncool ответ, быстро как расширение UIImageView, возможно, это может быть кому-то полезно:

extension UIImageView{
    func frameForImageInImageViewAspectFit() -> CGRect
    {
        if  let img = self.image {
            let imageRatio = img.size.width / img.size.height;

            let viewRatio = self.frame.size.width / self.frame.size.height;

            if (imageRatio < viewRatio)
            {
                let scale = self.frame.size.height / img.size.height;

                let width = scale * img.size.width;

                let topLeftX = (self.frame.size.width - width) * 0.5;

                return CGRectMake(topLeftX, 0, width, self.frame.size.height);
            }
            else
            {
                let scale = self.frame.size.width / img.size.width;

                let height = scale * img.size.height;

                let topLeftY = (self.frame.size.height - height) * 0.5;

                return CGRectMake(0, topLeftY, self.frame.size.width, height);
            }
        }

        return CGRectMake(0, 0, 0, 0)
    }
}

Следуя @MeetDoshi, вот расширение, которое должно это учесть.

extension UIImageView {
    /// Retrieve the scaled size of the image within this ImageView.
    /// - Returns: A CGRect representing the size of the image after scaling or nil if no image is set.
    func getScaledImageSize() -> CGRect? {
        if let image = self.image {
            return AVMakeRect(aspectRatio: image.size, insideRect: self.frame);
        }

        return nil;
    }
}

Я написал полезное расширение, которое включает это в свой набор дополнений, возможно, стоит попробовать.

Включенные функции

func getScaledImageSize() -> CGRect?
func getScaledImageSizeWithPadding() -> CGRect?
func getPaddingTop() -> CGFloat? {
func getPaddingBottom() -> CGFloat? {
func getPaddingLeft() -> CGFloat? {
func getPaddingRight() -> CGFloat?
func getScaledCoordinate(forX x: CGFloat, andY y: CGFloat, multiplier:CGFloat = 100.0) -> CGPoint?
func getScaledCoordinateWithPadding(forX x: CGFloat, andY y: CGFloat, multiplier:CGFloat = 100.0) -> CGPoint?

https://gist.github.com/nathan-fiscaletti/e1b85f68559f305db7342bfff9574563

Другие вопросы по теме