我正在开发一个应用程序,除其他外,需要处理图像视图,即旋转,调整大小,移动它们......将其保存在核心数据模型中,并按需恢复它们。
通过手势识别器执行旋转和缩放。 我在这里读到,在转换之后你不能使用图像视图框来检索真正的矩形,你必须使用边界和中心。
我尝试了几种组合保存/恢复视图框架,查看图层框架,视图边界,查看图层边界,没有运气。这是我最好的方法,但如果旋转角度不是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];
}
我将蓝色边框作为帮助应用于图像视图层。方向和位置相同,但恢复后形状为正方形,而保存前则为矩形。
提示非常好。
如果需要更多代码以澄清
,请告诉我非常感谢
答案 0 :(得分:13)
我遇到了同样的问题,在浪费了我的四个小时之后,我想我能够解决这个问题。关键点是不要存储框架,存储BOUNDS 和加载BOUNDS 。加载时订购也非常重要。
在这里,我做了什么:
-(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;
}
让我们知道它对你有用。