【发布时间】: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