Границы не подходят для 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]()
Ответы
Ответ 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