iOS 仿射变换

2017-03-03  本文已影响284人  南华coder

一、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;
}
上一篇 下一篇

猜你喜欢

热点阅读