Сохранение и восстановление поворота и размера UIImageView

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

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

Я пробовал несколько комбинаций сохранения / восстановления рамки вида, рамки слоя вида, границ вида, границ слоя вида, но безуспешно. Это мой лучший подход, но восстановленное изображение будет больше (хотя и только), если угол поворота не равен 0 (чем выше значение угла, тем больше размер восстановленного изображения).

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

Это код, используемый для сохранения настроек просмотра изображения:

- (void)updateModelCoords {

    CGFloat angle = atan2f(myImageView.transform.b, myImageView.transform.b);
    CGRect frame = [myImageView.layer frame];
    [myModel setW:[[NSNumber alloc] initWithFloat:frame.size.width]];
    [myModel setH:[[NSNumber alloc] initWithFloat:frame.size.height]];
    [myModel setX:[[NSNumber alloc] initWithFloat:frame.origin.x]];
    [myModel setY:[[NSNumber alloc] initWithFloat:frame.origin.y]];
    [myModel setCenterX:[[NSNumber alloc] initWithFloat:[myImageView center].x]];
    [myModel setCenterY:[[NSNumber alloc] initWithFloat:[myImageView center].y]];
    [myModel setAngle:[[NSNumber alloc] initWithFloat:angle]];

    // db save stuff...
}

Это код, используемый для восстановления настроек просмотра изображения:

- (void) restoreImage {
    float angle = [[myModel angle] floatValue];
    CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
    myImageView.transform = transform;
    CGRect bounds = [myImageView.layer bounds];
    bounds.size.width = [[myModel w] floatValue];
    bounds.size.height = [[myModel h] floatValue];
    bounds.origin.x = [[myModel x] floatValue];
    bounds.origin.y = [[myModel y] floatValue];
    [myImageView.layer setBounds:bounds];
    CGPoint center = CGPointMake([[myModel centerX] floatValue], [[myModel centerY] floatValue]);
    [myImageView setCenter:center];
}

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

Подсказки будут очень добры.

Сообщите мне, нужен ли дополнительный код для пояснения.

Большое спасибо

5
задан xQbert 24 November 2011 в 13:17
поделиться