【问题标题】:Save and restore rotation and size of an UIImageView保存和恢复 UIImageView 的旋转和大小
【发布时间】:2012-01-05 15:39:29
【问题描述】:

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

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

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

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

提示将非常受欢迎。

如果需要更多代码来澄清,请告诉我

非常感谢

【问题讨论】:

  • 有点不同的方法可能会有所帮助:您可以保存原始帧和应用的变换,然后在恢复时设置这两个属性(第一帧然后变换)。不知道这是否适合您的工作流程...
  • 我在设置框架后尝试设置变换,结果相同:/

标签: ios uiimageview resize rotation


【解决方案1】:

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

让我们知道它是否对您有用。

【讨论】:

  • 终于...在敲了我 5 天之后,我找到了解决方案...它有效...谢谢...应该早点找到它...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多