Сохранить и восстановить вращение и размер UIImageView - PullRequest
5 голосов
/ 24 ноября 2011

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

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

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

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

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

Дайте мне знать, если в коде потребуется больше кода.Чтобы уточнить

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

1 Ответ

13 голосов
/ 11 декабря 2011

Я столкнулся с той же проблемой, и, потратив четыре часа, думаю, я смог решить проблему.Ключевым моментом является НЕ хранить кадры, Сохранить BOUNDS и Загрузить BOUNDS .Также порядок ОЧЕНЬ ОЧЕНЬ важен при загрузке.

  1. Границы
  2. Центр
  3. Преобразование

Вот что я сделал:

-(void)writeImageState {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:NSStringFromCGAffineTransform(self.transform) forKey:@"transform"];
[dict setObject:NSStringFromCGPoint(self.center) forKey:@"center"];
[dict setObject:NSStringFromCGRect(self.bounds) forKey:@"bounds"];

[NSKeyedArchiver archiveRootObject:dict toFile:forUser.imageTransformationPath];
[dict release];
}
-(void)readImageState {
id obj = [NSKeyedUnarchiver unarchiveObjectWithFile:forUser.imageTransformationPath];
if(obj == nil) return;

CGAffineTransform transformed = CGAffineTransformFromString([obj objectForKey:@"transform"]);
CGPoint centered = CGPointFromString([obj objectForKey:@"center"]);
CGRect rect = CGRectFromString([obj objectForKey:@"bounds"]);

self.bounds = rect;
self.center = centered;
self.transform = transformed;
}

Дайте нам знать, сработало это для вас или нет.

...