例如A图为添加旋转、缩放、平移旋转的容器,B图为自己用CGContextRef 绘制。
需求A视图做三种转换时,利用坐标系绘制的B视图也要做完全一样的转换。
现将关键代码记录如下
1、缩放时对B图转换的代码
例如在A视图缩放时,B视图也要做相应完全一样的动作。
/// 平移动作 1
CGAffineTransform transform1 = CGAffineTransformMakeTranslation(recognizer.view.center.x, recognizer.view.center.y);
transform1 =CGAffineTransformScale(transform1, scale, scale);
if(fabs(self.rotateMark)>0){
transform1 =CGAffineTransformRotate(transform1,self.rotateMark);
}
if((fabs(self.transPoint.x) +fabs(self.transPoint.y)) >0){
transform1 =CGAffineTransformTranslate(transform1,self.transPoint.x,self.transPoint.y);
}
///平移动作2
transform1 =CGAffineTransformTranslate(transform1,-recognizer.view.center.x,-recognizer.view.center.y);
CGContextConcatCTM(ctx, transform1);
注意点一:平移动作1,2特别重要,主要是为了对准锚点,否则context绘制图锚点为原点。
注意点二:CGAffineTransformMakexxxx 和CGAffineTransform无make区别,make为在最初始化试图做缩放动作,无make的命令为在上一次缩放的基础上继续做新缩放。CGAffineTransformScale(recognizer.view.transform, scale, scale); //在已缩放大小基础下进行累加变化;区别于:使用 CGAffineTransformMakeScale 方法就是在原大小基础下进行变化
CGAffineTransform无make方法因为要对旋转和缩放进行归零,不方便记录所以对A视图的缩放、旋转、平移我都使用了CGAffineTransformMake方法。这里楼主声明了三个参数变量 scaleMark、transPoint、rotateMark记录试图A的缩放、平移、旋转数据,以方便对三种动作进行关联记录。
2、旋转时对B图转换的代码
CGAffineTransform transform1 = CGAffineTransformMakeTranslation(recognizer.view.center.x, recognizer.view.center.y);
//transform1 = CGAffineTransformRotate(transform, rotation);
transform1 =CGAffineTransformRotate(transform1, rotation);
if(self.scaleMark>0){
transform1 =CGAffineTransformScale(transform1,self.scaleMark,self.scaleMark);
}
if((fabs(self.transPoint.x) +fabs(self.transPoint.y)) >0){
transform1 =CGAffineTransformTranslate(transform1,self.transPoint.x,self.transPoint.y);
}
transform1 =CGAffineTransformTranslate(transform1,-recognizer.view.center.x,-recognizer.view.center.y);
CGContextConcatCTM(ctx, transform1);
3、平移B视图的代码
CGAffineTransform transform1 = CGAffineTransformMakeTranslation(gesture.view.center.x, gesture.view.center.y);
///必须先移动再做旋转和放大缩小转换
transform1 =CGAffineTransformTranslate(transform1,self.transPoint.x,self.transPoint.y);
if(fabs(self.rotateMark)>0){
transform1 =CGAffineTransformRotate(transform1,self.rotateMark);
}
if(self.scaleMark>0){
transform1 =CGAffineTransformScale(transform1,self.scaleMark,self.scaleMark);
}
transform1 =CGAffineTransformTranslate(transform1,-gesture.view.center.x,-gesture.view.center.y);
CGContextConcatCTM(ctx, transform1);
这里有个注意点:平移时 如果之前视图做过缩放或者旋转动作,那么就要进行缩放和旋转所以也要先进行锚点的改变,也就是注意点一所说的动作1和动作2。
其次 对B视图进行操作时注意先要移动再进行缩放或者旋转,不然不能对齐视图。
这个A、B视图坐标系转换困扰了好久,最开始楼主是自己进行计算转换的,但是旋转部分,B视图旋转时宽高比发生了变形。无奈之下还是用了系统方法。
吐槽一下transform不能直接设置锚点,只能进行手动移动位置改变锚点。
平移B视图代码 旋转B视图代码 缩放B视图代码截图
网友评论