Ios 变换视图,保持子视图大小

Ios 变换视图,保持子视图大小,ios,quartz-2d,cgaffinetransform,Ios,Quartz 2d,Cgaffinetransform,我有一个视图,用户可以通过UIgestureRecognitizer对其进行缩放和旋转。此视图包含两个视图: superview - content - button 内容应缩放和旋转,而按钮应保持其大小和位置 我正在使用CGAffineTransform和UIgestureRecognitizer来缩放和旋转视图 我怎样才能做到这一点 我试过: 缩放/旋转超级视图并重置按钮变换和位置。没有成功 要缩放/旋转内容,并尝试将内容.frame.size设置为超级视图。没有成功。(尽管

我有一个视图,用户可以通过
UIgestureRecognitizer
对其进行缩放和旋转。此视图包含两个视图:

 superview
  - content
  - button
内容
应缩放和旋转,而
按钮
应保持其大小和位置
我正在使用
CGAffineTransform
UIgestureRecognitizer
来缩放和旋转视图


我怎样才能做到这一点

我试过:

  • 缩放/旋转
    超级视图
    并重置
    按钮
    变换和位置。没有成功
  • 要缩放/旋转
    内容
    ,并尝试将
    内容.frame.size
    设置为
    超级视图
    。没有成功。(尽管我认为这一定会奏效)
  • 还有一些模糊的不好的东西,不值得一提
编辑:

处理旋转和缩放的代码:

if ([recognizer respondsToSelector:@selector(rotation)]) {
    CGFloat rotation = 0.0f - (self.lastRotation - [(UIRotationGestureRecognizer *) recognizer rotation]);

    CGAffineTransform currentTransform = self.content.transform;
    CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform, rotation);
    self.content.transform = newTransform;

    self.lastRotation = [(UIRotationGestureRecognizer *) recognizer rotation];

} else if ([recognizer respondsToSelector:@selector(scale)]) {
    CGFloat scale = 1.0f - (self.lastScale - [(UIPinchGestureRecognizer *) recognizer scale]);

    CGAffineTransform currentTransform = self.content.transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);
    self.content.transform = newTransform;

    self.lastScale = [(UIPinchGestureRecognizer *) recognizer scale];
}
只是基本的缩放和旋转,没什么特别的。

实际解决方案:

if ([recognizer respondsToSelector:@selector(rotation)]) {
    CGFloat rotation = 0.0f - (self.lastRotation - [(UIRotationGestureRecognizer *) recognizer rotation]);

    CGAffineTransform currentTransform = self.transform;
    CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform, rotation);
    self.transform = newTransform;

    self.lastRotation = [(UIRotationGestureRecognizer *) recognizer rotation];

} else if ([recognizer respondsToSelector:@selector(scale)]) {
    CGFloat scale = 1.0f - (self.lastScale - [(UIPinchGestureRecognizer *) recognizer scale]);

    CGRect bounds = self.bounds;
    bounds.size.width *= scale;
    bounds.size.height *= scale;
    self.bounds = bounds;

    self.lastScale = [(UIPinchGestureRecognizer *) recognizer scale];
}

使用项目符号第二项:缩放/旋转内容后,为什么要更改
content.frame.size
?请注意,
content.frame
是包围视图的最小矩形,因此在已旋转的视图上使用它很困难。您可以使用
中心
边界
属性移动和缩放视图,并使用
变换
围绕其中心旋转视图。如果缩放
内容
,则
边界
不会更改。我只设置了
大小
,因为
内容
将与
超级视图
具有不同的
x
y
坐标。
superview
可以在其父视图中移动。缩放和调整大小本身是通过使用
cGraffineTransform
完成的。
content
是一个没有子视图的单一视图,还是多个视图和/或子视图?
content
只是一个
UIImageView
。因此我的建议是使用
bounds.size
来缩放视图,仅对旋转使用
transform
,并使用
center
属性在
superview
中正确定位视图。