美文网首页
iOS 仿射变换

iOS 仿射变换

作者: 南华coder | 来源:发表于2017-03-03 10:33 被阅读284次

    一、iOS 仿射变换CGAffineTransform详解
    IOS开发UI篇--仿射变换(CGAffineTransform)使用小结
    iOS 仿射变换CGAffineTransform

    1、UIView有CGAffineTransform类型的属性transform,它是定义在二维空间上完成View的平移旋转缩放等效果的实现.

       //初始化,  CGAffineTransformIdentity是系统提供的一个常量,/* The identity transform: [ 1 0 0 1 0 0 ]. */(和原图一样的transform);
       CGAffineTransform  transform = CGAffineTransformIdentity;
    

    2、一个 view的 transform 属性对应一个 CGAffineTransform类的 3x3 矩阵(线性代数中的概念)。所有的变换都是以这个 view的 center做基准的。

    创建一个CGAffineTransform:CGAffineTransformMake(CGFloat a, CGFloat b, CGFloat c, CGFloat d, CGFloat tx, CGFloat ty),其中
    a表示水方向的缩放
    tx表示水平方向的偏移
    d表示垂直方向的缩放,
    ty表示垂直方向的偏移
    如果 b、c不为 0 的话,那么肯定发生了旋转。

    transform.png

    平移###

    根据本身的transform进行平移 CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty)
    根据本身的 transform 另外的transform进行平移CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty)
    

    缩放###

    根据本身的transform进行缩放 CGAffineTransformMakeScale(CGFloat sx,CGFloat sy)
    根据本身的transform后者另外的transform进行缩放CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
    

    旋转###

    根据本身的transform进行旋转 CGAffineTransformMakeRotation(CGFloat angle)(angle 旋转的角度)
    根据本身的transform后者另外的transform进行旋转 CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
    

    反向旋转###

    CGAffineTransformInvert(CGAffineTransform t)
    

    合并###

     CGAffineTransformConcat(_ t1: CGAffineTransform, _ t2: CGAffineTransform) -> CGAffineTransform
    

    应用仿射矩阵###

    CGPointApplyAffineTransform 得到新的点
    CGSizeApplyAffineTransform  得到新的size
    CGRectApplyAffineTransform  得到新的rect
    

    评测矩阵###

    CGAffineTransformIsIdentity  是否是CGAffineTransformIsIdentity
    CGAffineTransformEqualToTransform 看两个矩阵是否相等
    

    二、UIPanGestureRecognizer拖动手势
    UIPanGestureRecognizer使用小结

    1、UIGestureRecognizer是一个定义基本手势的抽象类,具体什么手势,在以下子类中包含

    1)拍击UITapGestureRecognizer (任意次数的拍击)      
    2)向里或向外捏UIPinchGestureRecognizer (用于缩放)      
    3)摇动或者拖拽UIPanGestureRecognizer (拖动)     
    4)擦碰UISwipeGestureRecognizer (以任意方向)      
    5)旋转UIRotationGestureRecognizer (手指朝相反方向移动)      
    6)长按UILongPressGestureRecognizer (长按)
    // 这些操作的目的都是用来修改UIView对象的frame,center,bounds属性,还有一个Transform属性。
    

    2、UIView管理手势识别器的方法有:

    – addGestureRecognizer:
    – removeGestureRecognizer:  
       gestureRecognizers  //property
    – gestureRecognizerShouldBegin:
    

    3、手势的处理

    //panGesture自定义处理手势的方法
    - (void)panGesture:(UIPanGestureRecognizer *)pan{
    
        CGPoint translatedPoint = [pan translationInView:self.view];
    
        CGFloat x = pan.view.center.x + translatedPoint.x;
        CGFloat y = pan.view.center.y + translatedPoint.y;
    
        CGPoint center = CGPointMake(x, y);
    
        XLOG(@"center = %@",NSStringFromCGPoint(center));
        //每次移动完,将移动量置为0,否则下次移动会加上这次移动量
        [pan setTranslation:CGPointMake(0, 0) inView:self.view];
        if (pan.state == UIGestureRecognizerStateEnded) {
      //        NSLog(@"pan.view == %f", pan.view.center.x);
        }
        //center超过显示范围
        if (center.x < 0 || center.x > SCREEN_WIDTH - _imageView.qsWidth/2 ||
            center.y < 0 || center.y > _funcBtnListView.qsTop - _imageView.qsHeight/2) {
            return;
        }
        _imageView.center = center;
    }
    
    - (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
        CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view];
        NSLog(@"translation == %f", translation.x);
      //    if (translation.x <= 0) {  //只能右滑
      //        return NO;
      //    }
        return YES;
    }

    相关文章

      网友评论

          本文标题:iOS 仿射变换

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