保存并恢复UIImageView的旋转和大小

5
我正在开发一个应用程序,需要处理图像视图,包括旋转、缩放、移动等操作,并将其保存在核心数据模型中,在需要时进行恢复。
旋转和缩放是通过手势识别器实现的。我在这里阅读到,变换后不能使用图像视图框架来检索真实矩形,而必须使用边界和中心。
我尝试了几种组合保存/恢复视图框架、视图层框架、视图边界、视图层边界,但都没有成功。这是我的最佳方法,但如果旋转角度不为0(角度值越高,恢复的图像大小就越大),则恢复的imageview会更大。
我知道存储框架值并在恢复边界时使用它们是不一致的,但我正在使用这种“最佳”结果。
以下是用于保存图像视图设置的代码:
- (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];
}

我会为图像视图层应用一个蓝色的边框作为辅助。方向和位置都一样,但在恢复之后形状是正方形,而在保存之前是长方形。
如果需要更多代码来澄清,请告诉我。欢迎提供提示。
非常感谢你。

或许可以尝试一种稍微不同的方法:你可以保存原始帧和应用的变换,然后在恢复时,先设置帧,再设置变换。不知道这是否适合你的工作流程... - il Malvagio Dottor Prosciutto
我尝试在设置相同的结果后设置框架转换:/ - Héctor
1个回答

14

我遇到了同样的问题,在浪费了4个小时后,我想我已经解决了这个问题。关键点是不要存储帧(Frame),而是存储边界(BOUNDS)加载边界(BOUNDS)。此外,加载顺序非常重要。

  1. 边界(Bounds)
  2. 中心(Center)
  3. 变换(Transform)

这就是我所做的:

-(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;
}

请告诉我们它是否对您有用。


终于,在撞了5天的墙之后,我找到了解决方案……它起作用了……谢谢……早些时候应该就找到它了…… - Naresh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接