Я разрабатываю приложение, которое, помимо прочего, должно обрабатывать представления изображений, то есть вращать, изменять размер, перемещать их ... сохранить это в основной модели данных и восстановить их. по запросу, по требованию.
Вращение и масштабирование выполняются с помощью распознавателей жестов. Я читал здесь, что после преобразования вы не можете использовать рамку просмотра изображения для получения реального прямоугольника, вместо этого вы должны использовать границы и центр.
Я пробовал несколько комбинаций сохранения / восстановления рамки вида, рамки слоя вида, границ вида, границ слоя вида, но безуспешно. Это мой лучший подход, но восстановленное изображение будет больше (хотя и только), если угол поворота не равен 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];
}
Я применяю синюю рамку к слою просмотра изображения в качестве помощника. Ориентация и положение такие же, но после восстановления форма будет квадратной, а до сохранения - прямоугольной.
Подсказки будут очень добры.
Сообщите мне, нужен ли дополнительный код для пояснения.
Большое спасибо