CGAffineTransformMakeRotation масштабирует изображение

У меня есть UIImageView, и я применяю преобразование вращения, используя CGAffineTransformMakeRotation. Это не только вращает изображение, но и масштабирует его.

Как правильно повернуть UIImageView и сохранить размер/масштаб изображения?

Я попытался установить

self.image.contentMode = UIViewContentModeCenter;
self.image.autoresizingMask = UIViewAutoresizingNone;

и вроде не помогает.


person some_id    schedule 30.05.2013    source источник
comment
Преобразование вращения не масштабирует изображение. Должна быть какая-то другая проблема с вашим кодом. Используете ли вы раскадровки для создания UIImageView? Попробуйте сузить его, закомментировав ссылки на объект, или попробуйте создать небольшой пример проекта, воспроизводящий проблему.   -  person maroux    schedule 30.05.2013
comment
Я создаю UIImageView в коде и применяю к нему преобразование. После прочтения здесь проблема заключается в том, что повернутый вид пытается вписать в него изображение и растягивает его. Есть некоторые решения с использованием IB, но я делаю это в коде.   -  person some_id    schedule 30.05.2013
comment
@Mar0ux Mar0ux - я только что создал базовый UIView с UIImageView, визуализированным в его методе drawRect с помощью drawInRect.   -  person some_id    schedule 30.05.2013
comment
Вы сами рисуете изображение с помощью drawInRect? Если это так, вам нужно применить преобразование к файлу CGContextRef. Кроме того, имейте в виду, что свойство frame UIView недействительно после применения преобразования.   -  person maroux    schedule 30.05.2013
comment
Да, я рисую их с помощью drawInRect. Я прохожу в кадре, который вы говорите недействительным. Он рендерит, просто масштабируется. Какой кадр он использует? Я применяю преобразование к контексту. У меня есть 3 изображения, которые масштабируются и вращаются независимо друг от друга и накладываются друг на друга. Я не могу применить преобразование ко всему контексту.   -  person some_id    schedule 30.05.2013
comment
Предупреждение. Если свойство преобразования не является преобразованием идентичности, значение этого свойства не определено и поэтому его следует игнорировать. Я думаю, вам нужно применить преобразование, нарисовать изображение, применить обратное преобразование (или восстановить состояние - не уверен, является ли преобразование частью состояния контекста).   -  person maroux    schedule 30.05.2013


Ответы (1)


попробуйте метод ниже

-(UIImage*)rotateImage:(UIImage*)img forAngle:(CGFloat)radian   {

    UIView *rotatedViewBox = [[UIView alloc]initWithFrame:CGRectMake(0, 0, img.size.width, img.size.height)];
    CGAffineTransform t = CGAffineTransformMakeRotation(radian);
    rotatedViewBox.transform = t;
    CGSize rotatedSize = rotatedViewBox.frame.size;

    UIGraphicsBeginImageContext(rotatedSize);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(context, rotatedSize.width, rotatedSize.height);
    CGContextRotateCTM(context, radian);
    CGContextScaleCTM(context, 1.0, -1.0);

    CGContextDrawImage(context, CGRectMake(-img.size.width, -img.size.height, img.size.width, img.size.height), img.CGImage);
    UIImage *returnImg = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();
    return returnImg;
}
person manujmv    schedule 30.05.2013
comment
Я не могу сделать это таким образом, поскольку я визуализирую imageview.image в контексте с режимом наложения, а затем преобразовываю изображение. Затем я вызываю setNeedsDisplay, чтобы получить новый перевод для рендеринга. - person some_id; 30.05.2013