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

时间:2011-11-24 13:06:08

标签: ios uiimageview resize rotation

我正在开发一个应用程序,除其他外,需要处理图像视图,即旋转,调整大小,移动它们......将其保存在核心数据模型中,并按需恢复它们。

通过手势识别器执行旋转和缩放。 我在这里读到,在转换之后你不能使用图像视图框来检索真正的矩形,你必须使用边界和中心。

我尝试了几种组合保存/恢复视图框架,查看图层框架,视图边界,查看图层边界,没有运气。这是我最好的方法,但如果旋转角度不是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];
}

我将蓝色边框作为帮助应用于图像视图层。方向和位置相同,但恢复后形状为正方形,而保存前则为矩形。

提示非常好。

如果需要更多代码以澄清

,请告诉我

非常感谢

1 个答案:

答案 0 :(得分:13)

我遇到了同样的问题,在浪费了我的四个小时之后,我想我能够解决这个问题。关键点是不要存储框架,存储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;
    }
    

    让我们知道它对你有用。