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

Границы не подходят для Aspect Fit?

Я программно настраиваю изображение с рамкой. Я установил режим содержимого образа Image в Aspect Fit, который работает, но граница остается исходным квадратом.

Код:

CGRect imageViewRect = CGRectMake(left, top, 158, 119); 
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageViewRect];
        [imageView setContentMode:UIViewContentModeScaleAspectFit];
        [imageView setImage:image];
        [imageView.layer setBorderColor:[[UIColor blackColor] CGColor]];
        [imageView.layer setBorderWidth:3.0];

Очевидно, что я хочу, чтобы черная рамка настраивалась с учетом аспекта и окружала изображение со всех сторон. Вместо этого он остается в исходном фрейме и выглядит следующим образом:

wHAT IT LOOKS LIKE

4b9b3361

Ответ 1

Используя метод, слегка модифицированный Фрэнком Шмиттом в этом сообщении, вы можете добавить метод для разработки кадра, необходимого для отображения изображения, масштабированного по аспекту:

- (CGRect)getFrameSizeForImage:(UIImage *)image inImageView:(UIImageView *)imageView {

    float hfactor = image.size.width / imageView.frame.size.width;
    float vfactor = image.size.height / imageView.frame.size.height;

    float factor = fmax(hfactor, vfactor);

    // Divide the size by the greater of the vertical or horizontal shrinkage factor
    float newWidth = image.size.width / factor;
    float newHeight = image.size.height / factor;

    // Then figure out if you need to offset it to center vertically or horizontally
    float leftOffset = (imageView.frame.size.width - newWidth) / 2;
    float topOffset = (imageView.frame.size.height - newHeight) / 2;

    return CGRectMake(leftOffset, topOffset, newWidth, newHeight);
}

Затем вы можете вызвать это после установки изображения UIImageView:

CGRect frame = [self getFrameSizeForImage:imageView.image inImageView:imageView]; 

Наконец, установите кадр UIImageView с помощью этого фрейма, смещая положение для любого изменения ширины/высоты:

CGRect imageViewFrame = CGRectMake(imageView.frame.origin.x + frame.origin.x, imageView.frame.origin.y + frame.origin.y, frame.size.width, frame.size.height);
imageView.frame = imageViewFrame;

Ответ 2

Самый быстрый способ, которым я получил это:

  • В IB я создал два imageViews, верхнюю для моего образа, и один под ней за границу, что я могу либо просто установить сплошной цвет, или использовать любой вид графического актива

Затем в коде я корректирую рамку фонового изображения немного больше, чем изображение переднего плана:

float kBorderSize=5.0;
CGRect imageRect=AVMakeRectWithAspectRatioInsideRect(imageView.image.size,imageView.frame);
CGRect borderRect=CGRectMake(imageRect.origin.x-kBorderSize, imageRect.origin.y-kBorderSize, imageRect.size.width+2*kBorderSize, imageRect.size.height+2*kBorderSize);
backgroundImage.frame=borderRect;

для этого требуется импорт:

#import <AVFoundation/AVUtilities.h>

Ответ 3

Эта граница находится на изображении, а не на изображении. Чтобы исправить это, вы можете изменить размер вашего UIImageView на тот же размер, что и изображение (или иметь такое же соотношение ширины и высоты, что и изображение, если вы уменьшаете масштаб) или фактически добавить границу к самому изображению.

Оба этих сценария описаны в этом вопросе SO