Для всех, кто наткнулся на этот вопрос и многие другие, как на это без четкого ответа, я написал аккуратную небольшую категорию, которая выполняет это на уровне модели, изменяя непосредственно UIImage
, а не просто изменяя представление. Просто используйте этот метод, возвращенное изображение будет помещено в квадратную форму, независимо от того, какая сторона больше.
- (UIImage *) letterboxedImageIfNecessary
{
CGFloat width = self.size.width;
CGFloat height = self.size.height;
// no letterboxing needed, already a square
if(width == height)
{
return self;
}
// find the larger side
CGFloat squareSize = MAX(width,height);
UIGraphicsBeginImageContext(CGSizeMake(squareSize, squareSize));
// draw black background
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetRGBFillColor(context, 0.0, 0.0, 0.0, 1.0);
CGContextFillRect(context, CGRectMake(0, 0, squareSize, squareSize));
// draw image in the middle
[self drawInRect:CGRectMake((squareSize - width)/2, (squareSize - height)/2, width, height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}