gpt4 book ai didi

ios - 保存和恢复 UIImageView 的旋转和大小

转载 作者:可可西里 更新时间:2023-11-01 04:16:45 27 4
gpt4 key购买 nike

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

旋转和缩放是通过手势识别器执行的。我在这里读到,在转换之后,您不能使用 ImageView 框架来检索真实的矩形,您必须改用边界和中心。

我尝试了几种保存/恢复 View 框架、 View 层框架、 View 边界、 View 层边界的组合,但没有成功。这是我最好的方法,但如果旋转角度不为 0(角度值越大,恢复的图像尺寸越大),恢复的 imageview 会更大(虽然只是)。

我理解存储帧值并在恢复边界时使用它们是不连贯的,但我得到了我的“最佳”结果。

这是用于保存 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...
}

这是用于恢复 ImageView 设置的代码:

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

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

提示会很受欢迎。

让我知道是否需要更多代码来阐明

非常感谢

最佳答案

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

让我们知道它是否适合您。

关于ios - 保存和恢复 UIImageView 的旋转和大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257561/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com