美文网首页
iOS坐标系旋转让两个图像完全重合的心得

iOS坐标系旋转让两个图像完全重合的心得

作者: 飞羽vk | 来源:发表于2022-06-15 16:58 被阅读0次

    例如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视图代码截图

    相关文章

      网友评论

          本文标题:iOS坐标系旋转让两个图像完全重合的心得

          本文链接:https://www.haomeiwen.com/subject/qopxvrtx.html