transform屬性

transform矩陣計算原理:
http://www.itdecent.cn/p/6b799eeee8dd
https://www.cnblogs.com/delonchen/archive/2011/08/03/iostransform.html

ad對應(yīng)縮放,bc對應(yīng)旋轉(zhuǎn),tx,ty對應(yīng)位移

大部分的教程說,公式可以總結(jié)為
x = ax+cy+tx
y = bx+dy+ty

transform可以辦到控件的平移,旋轉(zhuǎn),縮放。
每種效果都對應(yīng)著兩個方法
CGAffineTransform帶make與不帶make區(qū)別?

1.帶make相對的最原始的位置做形變操作(一般只用做一次形變)
2.不帶make是相對于指定的形變開始進行,相對于上一次操作(一般用于做多次形變.)

- (IBAction)transform:(id)sender {
    [UIView animateWithDuration:0.5 animations:^{
        //平移
        /**
         CGAffineTransform帶make與不帶make區(qū)別?
         1.帶make相對的最原始的位置做形變操作.(一般只用做一次形變.)
         
         不帶make是相對于指定的形變開始進行.
         相對于上一次操作(一般用于做多次形變.)
         */
    
        //self.imageV.transform = CGAffineTransformMakeTranslation(0, 300);
        //self.imageV.transform = CGAffineTransformTranslate(self.imageV.transform, 0, 100);
        
        // 清除平移,讓每次平移都是相對上一次的位置
          //[pan setTranslation:CGPointZero inView:self.imageView];
  
        //旋轉(zhuǎn)
        //參數(shù):旋轉(zhuǎn)的角度(是弧度)
        //self.imageV.transform = CGAffineTransformMakeRotation(M_PI);
        ///self.imageV.transform = CGAffineTransformRotate(self.imageV.transform, M_PI_2);
            // 復(fù)位,只要想相對于上一次旋轉(zhuǎn)就復(fù)位
      // [rotation setRotation:0];
        
        
        //縮放
        //縮放比例(1代表是原始大小.)
        //self.imageV.transform = CGAffineTransformMakeScale(1.5, 1.5);
        //self.imageV.transform = CGAffineTransformScale(self.imageV.transform, 1.5, 1.5);
        self.imageV.transform = CGAffineTransformScale(self.imageV.transform, 0.8, 0.8);
        // 復(fù)位,只要相當(dāng)于上一次的縮放
       // [pinch setScale:1];
        
    }];
  
   
}

使用transform實現(xiàn)屏幕上View隨手指移動,實現(xiàn)思路:
1、先要監(jiān)聽到view上面手指的Touch事件
2、獲取到手指Touch的當(dāng)前點和上一個點的坐標(biāo)(手指相對當(dāng)前view的坐標(biāo)),并算出水平方向和垂直方向的偏移;
3、使用transform屬性,實現(xiàn)view的平移

//當(dāng)觸摸移動時調(diào)用
//NSArray:集合里面存入的元素都是有序的
//NSArray:集合里面存入的元素都是無序的
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    NSLog(@"%s",__func__);
    
    
    //獲取UITouch對象
    UITouch *touch = [touches anyObject];
    
    //上一個點:prePoint
    //當(dāng)前點:curPoint 手指在紅色view上面Touch的坐標(biāo)(根據(jù)控件本身來講的)
    //獲取上一點
    CGPoint preP = [touch previousLocationInView:self];
    //獲取當(dāng)前點
    CGPoint cur = [touch locationInView:self];
    
    NSLog(@"preP = %@",NSStringFromCGPoint(preP));
    NSLog(@"cur = %@",NSStringFromCGPoint(cur));
    
    //x偏移量 = 當(dāng)前點.x – 上一個點的.x
    CGFloat offsetX = cur.x - preP.x;
    //y偏移量 = 當(dāng)前點.y – 上一個點的.y
    CGFloat offsetY = cur.y - preP.y;
    
    //讓當(dāng)前View跟著手指移動
    //Transform->平移
    self.transform = CGAffineTransformTranslate(self.transform, offsetX, offsetY);
    
    
}

注意:UITouch對象,一根手指觸摸屏幕就會產(chǎn)生一個UITouch對象,單指操作,(NSSet<UITouch *> *)touches這個集合中只會有一個UITouch對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容