2012年11月3日 星期六

UIView的Animation(十ㄧ)

在UIView的矩陣轉換後結果的評估


如果在正式轉換前,我們需要評估圖區轉換後的位置,並適當地加入控制程式在轉換後的位置,就必須應用下面三個Function,分別可以得到點/位置/大小。
不另外做試驗程式,僅作資料整理。


Apple 原始資料
https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGAffineTransform/Reference/reference.html


CGPointApplyAffineTransform

Returns the point resulting from an affine transformation of an existing point.
CGPoint CGPointApplyAffineTransform (
   CGPoint point,
   CGAffineTransform t
); 
 

CGRectApplyAffineTransform

Applies an affine transform to a rectangle.
CGRect CGRectApplyAffineTransform ( CGRect rect, CGAffineTransform t );

CGSizeApplyAffineTransform

Returns the height and width resulting from a transformation of an existing height and width.
CGSize CGSizeApplyAffineTransform (
   CGSize size,
   CGAffineTransform t
);

 

example1

CGAffineTransform translateTransform = CGAffineTransformMakeTransation(point.x, point.y);

CGAffineTransform rotateTransform = CGAffineTransformMakeRotation(angle);

CGAffineTransform customTransform = CGAffineTransformConcat(CGAffineTransformConcat(
CGAffineTransformInvert(translateTransform), rotateTransform), translateTransform);

newPoint = CGPointApplyAffineTransform(initialPoint, customTransform);



example2

CGFloat factor = [(UIPinchGestureRecognizer *)sender scale];
CGAffineTransform zt = CGAffineTransformScale(CGAffineTransformIdentity, factor, factor); senderView.frame = CGRectApplyAffineTransform(initialFrame, zt);




example3

CGRect imgRect = CGRectMake(0, 0, width, height);
CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians);
CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform);


example4


CGSize imageViewSize = previewImage.size; 
CGSize imageSize = previewImage.image.size; 
// Find the scaling required for the image
 to fit the image view (as for aspect fill). 
CGFloat imageWidthScale = fabsf(imageViewSize.width / imageSize.width); 
CGFloat imageHeightScale = fabsf(imageViewSize.height / imageSize.height); 
CGFloat imageScale = (imageWidthScale > imageHeightScale) ? 
imageWidthScale : imageHeightScale; 
// Determine the new image size, after scaling. 
CGSize scaledImageSize = CGSizeApplyAffineTransform(imageSize, CGAffineTransformMakeScale(imageScale, imageScale));




example5
 
CGSize oldImageSize = imageView.bounds.size;
// Transforming code here
CGAffineTransform currentTransform = imageView.transform;
CGSize newImageSize = CGSizeApplyAffineTransform(oldImageSize, currentTransform);




2012年11月2日 星期五

UIView的Animation(十)

在UIView使用組合方式來顯示動畫模式

CGAffineTransformConcat : 將兩個動畫模式給組合起來,成為一種動畫模式。
 
 
一個實際上的使用例 
// Rotate 45 degrees
CGAffineTransform rotate = CGAffineTransformMakeRotation(45*(M_PI/180));
// Move to the left
CGAffineTransform translate = CGAffineTransformMakeTranslation(-50,0);
// Apply them to a view
self.view.transform = CGAffineTransformConcat(translate, rotate); 

另一種方式來表示,不用CGAffineTransformConcat
Image1.transform = CGAffineTransformRotate(Image1.transform, 45*M_PI/180); 
Image1.transform = CGAffineTransformTranslate(Image1.transform, -50, 0);

第二種方式會將整個動畫轉移模式記錄在Image1.transform內。 
 
所以CGAffineTransformConcat的使用方法,在實際上的運用也是有需求的。
 

BEAM Robotics 微型仿生機器人

「BEAM Robotics」(BEAM即生物學、電子學、美學與機械的結合)

PS: Biology, Electronics, Aesthetics, and Mechanics.

 另外兩種說法
Biotechnology Ethology Analogy Morphology
生物技术,行为学,模拟的(电路),形态学

Building Evolution Anarchy Modularity
建造,进化,无序性,模块化


main web : http://www.beam-wiki.org/wiki/Main_Page
wiki  web : http://zh.wikipedia.org/wiki/BEAM

BEAM是一類主要只使用簡單的模擬電路與感測器的微型機器人,它們往往帶有一定迴路構成的控制網路,這一部分也被稱為「神經元」。 BEAM一詞是Biology、Electronics、Aesthetics、與Mechanics幾個詞詞頭的縮寫,代表著仿生的、電子的、美學的、 機械的等多重含義(其中E也有人意指Evolution)。BEAM最基本的想法來自於構建像生物一樣具有反應應激能力的機器,1988年美國Los Alamos的物理學家Mark W. Tilden發明了第一個神經元電路以及所控制的BEAM機器人。此外BEAM的另外一些特徵是強調太陽能的使用以及模仿昆蟲本能的行為,盡量簡單的結構 與機械設計,盡量再生利用等。

現在看到的BEAM Robotics,內部構造越來越複雜,已經包含了小型MCU系統,很好奇未來的發展。


一個小型機器人收集網頁
http://stanley21.pixnet.net/blog/category/1451033

另一個有趣的網頁
http://www.eettaiwan.com/ART_8800677450_876045_NT_84e7a62e.HTM?click_from=8800099470,9950038858,2012-11-02,EETOL,ARTICLE_ALERT&jumpto=view_welcomead_1351796846329

2012年11月1日 星期四

UIView的Animation(九)

在UIView使用2D座標矩陣運算的Function


CGAffineTransformMake   2D座標運算,但不能將儲存結果,只能將原始資料運算一次的結果顯示出來。


基本數學可參考
http://tw.myblog.yahoo.com/delphi_bnq/article?mid=-2&next=371&l=a&fid=20

http://blog.csdn.net/likendsl/article/details/7595611

Apple的資料
https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CGAffineTransform/Reference/reference.html


struct CGAffineTransform
{
  CGFloat a, b, c, d;
  CGFloat tx, ty;
};


CGAffineTransform CGAffineTransformMake (CGFloat a,CGFloat b,CGFloat c,CGFloat d,CGFloat tx,CGFloat ty);

为了把二维图形的变化统一在一个坐标系里,引入了齐次坐标的概念,即把一个图形用一个三维矩阵表示,其中第三列总是(0,0,1),用来作为坐标系的标准。所以所有的变化都由前两列完成。
以上参数在矩阵中的表示为:
 |a    b    0|
 |c    d    0|
 |tx   ty   1|
运算原理:原坐标设为(X,Y,1);
                            |a    b    0|
       [X,Y,  1]      |c    d    0|     =     [aX + cY + tx   bX + dY + ty  1] ;
                            |tx    ty  1|

通常,我們需要將一個圖形關於某一特定點(x0,y0)而非原點旋轉。一般情況下,以下
三步可以實現這種操作:首先,變換坐標空間到(-x0,-y0),然後旋轉,最後將坐標空間變換回(x0,y0)。組合變換公式為:
x'= cos(a) × (x – x0) – sin(a) × (y – y0) + x0
y'= sin(a) × (x – x0) + cos(a) × (y – y0) + y0

example
Image1.transform = CGAffineTransformMake(xScale.value*cos(rotationAngle.value*PI/180), sin(rotationAngle.value*PI/180), -sin(rotationAngle.value*PI/180), yScale.value*cos(rotationAngle.value*PI/180), XOffset.value, YOffset.value); 


以下例子改自前一篇
1. 增加一個2D矩陣轉移的Switch

2. 將元件註冊到mainViewController.h
@property (weak, nonatomic) IBOutlet UISwitch *transferSwitch;
@property (weak, nonatomic) IBOutlet UILabel *transferLabel;

3. 增加相關的程式碼到mainViewController.m
...
@synthesize transferLabel, transferSwitch;
...
- (IBAction)transferAction:(id)sender {
   
    UIButton *button = (UIButton *)sender;
    NSInteger tag = button.tag;
   
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:kDuration];
   
    switch (tag) {
        case 105:
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
            break;
        case 106:
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
            break;
        case 107:
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
            break;
        case 108:
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
            break;
        default:
            break;
    }
   
    self.typeID += 1;
    if (self.typeID > 3) {
        self.typeID = 0;
    }
   
    if (twoImageMode.on == YES) {
       NSUInteger image1 = [[self.view subviews] indexOfObject:self.Image1];
       NSUInteger image2 = [[self.view subviews] indexOfObject:self.Image2];
       [self.view exchangeSubviewAtIndex:image1 withSubviewAtIndex:image2];
    }
    else {
       
        [self removeImageView];
   
        if (image1Enable.on == YES) {
       
       
            if (transferSwitch.on == YES) {
               
               Image1.transform = CGAffineTransformMake(xValueSlider.value*cos(rotationSlider.value*PI/180), sin(rotationSlider.value*PI/180), -sin(rotationSlider.value*PI/180), yValueSlider.value*cos(rotationSlider.value*PI/180), XOffsetSlider.value, YOffsetSlider.value);
            }
            else {

               if (unlimitChange.on == YES)
                   Image1.transform = CGAffineTransformScale(Image1.transform, xValueSlider.value
                                                      , yValueSlider.value);
               else
                   Image1.transform = CGAffineTransformMakeScale(xValueSlider.value
                                                          , yValueSlider.value);
           
               if (unlimitChange.on == YES)
                   Image1.transform = CGAffineTransformRotate(Image1.transform, rotationSlider.value*PI/180);
               else
                   Image1.transform = CGAffineTransformMakeRotation(rotationSlider.value*PI/180);
               
               if (unlimitChange.on == YES)
                   Image1.transform = CGAffineTransformTranslate(Image1.transform, XOffsetSlider.value, YOffsetSlider.value);
               else
                   Image1.transform = CGAffineTransformMakeTranslation(XOffsetSlider.value, YOffsetSlider.value);
           
               if (invertSwitch.on == YES)
                   Image1.transform = CGAffineTransformInvert(Image1.transform);
           
            }
           
            Image1.alpha = transparentSlider.value;
           
            [self.view  addSubview:Image1];
            [self.view sendSubviewToBack:Image1];
        }
        else  {
           
            if (transferSwitch.on == YES) {
               
                Image2.transform = CGAffineTransformMake(xValueSlider.value*cos(rotationSlider.value*PI/180), sin(rotationSlider.value*PI/180), -sin(rotationSlider.value*PI/180), yValueSlider.value*cos(rotationSlider.value*PI/180), XOffsetSlider.value, YOffsetSlider.value);
            }
            else {

               if (unlimitChange.on == YES)
                   Image2.transform = CGAffineTransformScale(Image2.transform, xValueSlider.value
                                                          , yValueSlider.value);
               else
                  Image2.transform = CGAffineTransformMakeScale(xValueSlider.value
                                                              , yValueSlider.value);
           
               if (unlimitChange.on == YES)
                   Image2.transform = CGAffineTransformRotate(Image2.transform, rotationSlider.value*PI/180);
               else
                   Image2.transform = CGAffineTransformMakeRotation(rotationSlider.value*PI/180);
           
               if (unlimitChange.on == YES)
                   Image2.transform = CGAffineTransformTranslate(Image2.transform, XOffsetSlider.value, YOffsetSlider.value);
               else
                   Image2.transform = CGAffineTransformMakeTranslation(XOffsetSlider.value, YOffsetSlider.value);
           
               if (invertSwitch.on == YES)
                   Image2.transform = CGAffineTransformInvert(Image2.transform);
           
            }
           
            Image2.alpha = transparentSlider.value;
           
            [self.view  addSubview:Image2];
            [self.view sendSubviewToBack:Image2];
        }
    }
       
       
    [UIView setAnimationDelegate:self];
    // 动画完毕后调用某个方法
    //[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
    [UIView commitAnimations];
   
    if (change == 1)
        change = 2;
    else
        change = 1;
}
...
- (IBAction)enableTransfer:(id)sender {
    if (transferSwitch.on == YES)
        transferLabel.text = @"起動2D矩陣轉移";
    else
        transferLabel.text = @"關閉2D矩陣轉移";
}


4. 執行結果,如同綜合了旋轉/平移與縮放的三個功能於一次,不另外截圖


2012年10月31日 星期三

Xcode - 模擬器不能執行的問題 (二)

當連上實機時,再一次拔下實機,然後執行simulator測試,會發現simulator無法執行。

此問題可能是卡在,使用舊的App ID來作實機測試,並且當實機上有舊的App。


解決方法如下

1.  再一次連上實機,使用實機再做一次,此時需要移除實機上的測試App

2.  在不移除實機的狀況下,改變設定到simulator,並且Clean/Run,應該就可以了

3.  如果還是不行,將Xcode重開,並重複1/2的步驟。


以上是實作經驗。

2012年10月30日 星期二

NSNumber的使用


簡當整理一下NSNumber的使用
NSNumber提供一個機制,將數值用Class包裝起來,給NSArray之類來做儲存。


1. int/float/double ...變數與NSNumber的互轉


int result = [MyNsNumber intValue]; // NSNumber to be int


NSNumber number = [NSNumber numberWithInt:10]; // int to NSNumber;



2. init的設定方法
NSNumber *intNumber = [[NSNumber alloc] initWithInt:100];

NSNumber *floatNumber = [[NSNumber alloc] initWithFloat:99.9];

NSNumber *doubleNumber = [[NSNumber alloc] initWithDouble:100.0];

NSNumber *charNumber = [[NSNumber alloc] initWithChar:'T'];

NSNumber *boolNumber = [[NSNumber alloc] initWithBool:TRUE];


配製定義的最大/最小值

NSNumber* intNumber2 = [NSNumber numberWithInt:INT_MAX];

NSNumber* floatNumber2 = [NSNumber numberWithFloat:FLT_MIN];

NSNumber* doubleNumber2 = [NSNumber numberWithDouble:DBL_MAX];



3.比對方法
基本上我是將值轉換成int/float一般的數值變數再去做比較,但是NSNumber也是有提供比對機制


[intNumber isEqualToNumber: floatNumber]
使用isEqualToNumber:方法根据数值比较两个NSNumber对象。该程序测试返回的Boolean值,以查看这两个值是否相等。

可用compare:方法来测试一个数值型的值是否在数值上小于、等于或大于另一个值。消息表达式

[intNumber compare: myNumber]
在 intNumber中的值小于myNumber中的值时,返回值NSOrderedAscending;如果这两个数相等,则返回值 NSOrderedSame;如果第一个值大于第二个值,则返回值NSOrderedDescending。在头文件NSObject.h中已经定义了这 些返回值。




2012年10月29日 星期一

UIView的Animation(八)

在UIView使用坐標轉換的Function

CGAffineTransformInvert: 將X/Y的起始坐標反向

example 
Image1.transform = CGAffineTransformInvert(Image1.transform);

接連數個圖像的縮放/平移/反轉/鏡射及這個坐標轉換,皆可參考矩陣數學中的計算。


以下例子改自前一篇

1. 增加一個切換啓動的Switch

2. 將元件註冊到mainViewController.h
@property (weak, nonatomic) IBOutlet UISwitch *invertSwitch;
@property (weak, nonatomic) IBOutlet UILabel *invertLabel;

3. 增加相關的程式碼到mainViewController.m
...
@synthesize invertLabel, invertSwitch;
...
- (IBAction)transferAction:(id)sender {
   
    UIButton *button = (UIButton *)sender;
    NSInteger tag = button.tag;
   
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:kDuration];
   
    switch (tag) {
        case 105:
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
            break;
        case 106:
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
            break;
        case 107:
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
            break;
        case 108:
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
            break;
        default:
            break;
    }
   
    self.typeID += 1;
    if (self.typeID > 3) {
        self.typeID = 0;
    }
   
    if (twoImageMode.on == YES) {
       NSUInteger image1 = [[self.view subviews] indexOfObject:self.Image1];
       NSUInteger image2 = [[self.view subviews] indexOfObject:self.Image2];
       [self.view exchangeSubviewAtIndex:image1 withSubviewAtIndex:image2];
    }
    else {
       
        [self removeImageView];
   
        if (image1Enable.on == YES) {
       
           
            if (unlimitChange.on == YES)
                Image1.transform = CGAffineTransformScale(Image1.transform, xValueSlider.value
                                                      , yValueSlider.value);
            else
                Image1.transform = CGAffineTransformMakeScale(xValueSlider.value
                                                          , yValueSlider.value);
           
            if (unlimitChange.on == YES)
                Image1.transform = CGAffineTransformRotate(Image1.transform, rotationSlider.value*PI/180);
            else
                Image1.transform = CGAffineTransformMakeRotation(rotationSlider.value*PI/180);
               
            if (unlimitChange.on == YES)
                Image1.transform = CGAffineTransformTranslate(Image1.transform, XOffsetSlider.value, YOffsetSlider.value);
            else
                Image1.transform = CGAffineTransformMakeTranslation(XOffsetSlider.value, YOffsetSlider.value);
           
            if (invertSwitch.on == YES)
                Image1.transform = CGAffineTransformInvert(Image1.transform);

           
            Image1.alpha = transparentSlider.value;
           
            [self.view  addSubview:Image1];
            [self.view sendSubviewToBack:Image1];
        }
        else  {
           
            if (unlimitChange.on == YES)
                Image2.transform = CGAffineTransformScale(Image2.transform, xValueSlider.value
                                                          , yValueSlider.value);
            else
                Image2.transform = CGAffineTransformMakeScale(xValueSlider.value
                                                              , yValueSlider.value);
           
            if (unlimitChange.on == YES)
                Image2.transform = CGAffineTransformRotate(Image2.transform, rotationSlider.value*PI/180);
            else
                Image2.transform = CGAffineTransformMakeRotation(rotationSlider.value*PI/180);
           
            if (unlimitChange.on == YES)
                Image2.transform = CGAffineTransformTranslate(Image2.transform, XOffsetSlider.value, YOffsetSlider.value);
            else
                Image2.transform = CGAffineTransformMakeTranslation(XOffsetSlider.value, YOffsetSlider.value);
           
            if (invertSwitch.on == YES)
                Image2.transform = CGAffineTransformInvert(Image2.transform);

           
            Image2.alpha = transparentSlider.value;
           
            [self.view  addSubview:Image2];
            [self.view sendSubviewToBack:Image2];
        }
    }
       
       
    [UIView setAnimationDelegate:self];
    // 动画完毕后调用某个方法
    //[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
    [UIView commitAnimations];
   
    if (change == 1)
        change = 2;
    else
        change = 1;
}
...
- (IBAction)invertChange:(id)sender {
    if (invertSwitch.on == YES)
        invertLabel.text = @"反轉";
    else
        invertLabel.text = @"不反轉";
}
 

4. 執行結果,分別對X/Y方向平移後,再執行坐標反轉後的結果。





2012年10月28日 星期日

Xcode上好用的快速功能鍵


簡當整理一下Xcode上好用常用的快速功能鍵,可以增加寫Code的效率。

1. command + C  --> Copy

2. command + V  --> Paste

3. command + X --> Cut

4. command + ]   --> 所選文字向後移動一個 Tab空間

5. command + [   --> 所選文字向前移動一個 Tab空間

6. command + Z  --> undo

7. command + shift + Z --> Redo

8. command + F  --> search  on current file

9. command + shift + F --> search in current project

10. command + R  --> Run

11. command + shift + K --> clean

12. command + option/alt + [   --> 整行向上

13. command + option/alt + ]   --> 整行向下

14. command + /  --> 整行變成注解(自動在整行前面加上 //)

15. esc(脫逃鍵)  --> 編輯時按下,會出現建議輸入變數/API。

16.  command + delete  --> 整行刪除,回復空白

17.  command + \  --> 增加或刪除 breakpoint

18.  command + K  --> 清除debug console的內容
 
19. control + esc + i  --> 自動排列整齊 (code beautiful)

20. 自定義快速鍵:Xcode -> Preferences -> Key Bindings (終極秘技)
      example :  我自己的刪除一行快速鍵 ==>   command + control + delete

另外可參考下面網頁,有更多特殊的快速鍵可以用。
http://samwize.com/2012/09/26/xcode-4-dot-5-tips-and-tricks/




UIView的Animation(七)

在UIView平移的Function


CGAffineTransformTranslate --讓影像作平移,並會修改image的資料
CGAffineTransformMakeTranslation-只顯示平移結果,不會修改image資料,因此只會顯示一次平移的結果。

example
Image1.transform = CGAffineTransformTranslate(Image1.transform, X-Offset, Y-Offset);
Image1.transform = CGAffineTransformMakeTranslation(X-Offset, Y-Offset);


 以下例子改自前一篇

1. 增加兩個平移的Slide


2. 將元件註冊到mainViewController.h
@property (weak, nonatomic) IBOutlet UISlider *XOffsetSlider;
@property (weak, nonatomic) IBOutlet UISlider *YOffsetSlider;
@property (weak, nonatomic) IBOutlet UILabel *XOffsetLabel;
@property (weak, nonatomic) IBOutlet UILabel *YOffsetLabel;

3. 增加相關的程式碼到mainViewController.m 
.....

@synthesize XOffsetLabel, XOffsetSlider;
@synthesize YOffsetLabel, YOffsetSlider;

.....
- (IBAction)transferAction:(id)sender {
   
    UIButton *button = (UIButton *)sender;
    NSInteger tag = button.tag;
   
    CGContextRef context = UIGraphicsGetCurrentContext();
    [UIView beginAnimations:nil context:context];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationDuration:kDuration];
   
    switch (tag) {
        case 105:
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
            break;
        case 106:
            [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
            break;
        case 107:
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];
            break;
        case 108:
            [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
            break;
        default:
            break;
    }
   
    self.typeID += 1;
    if (self.typeID > 3) {
        self.typeID = 0;
    }
   
    if (twoImageMode.on == YES) {
       NSUInteger image1 = [[self.view subviews] indexOfObject:self.Image1];
       NSUInteger image2 = [[self.view subviews] indexOfObject:self.Image2];
       [self.view exchangeSubviewAtIndex:image1 withSubviewAtIndex:image2];
    }
    else {
       
        [self removeImageView];
   
        if (image1Enable.on == YES) {
       
           
            if (unlimitChange.on == YES)
                Image1.transform = CGAffineTransformScale(Image1.transform, xValueSlider.value
                                                      , yValueSlider.value);
            else
                Image1.transform = CGAffineTransformMakeScale(xValueSlider.value
                                                          , yValueSlider.value);
           
            if (unlimitChange.on == YES)
                Image1.transform = CGAffineTransformRotate(Image1.transform, rotationSlider.value*PI/180);
            else
                Image1.transform = CGAffineTransformMakeRotation(rotationSlider.value*PI/180);
               
            if (unlimitChange.on == YES)
                Image1.transform = CGAffineTransformTranslate(Image1.transform, XOffsetSlider.value, YOffsetSlider.value);
            else
                Image1.transform = CGAffineTransformMakeTranslation(XOffsetSlider.value, YOffsetSlider.value);

           
            Image1.alpha = transparentSlider.value;
           
            [self.view  addSubview:Image1];
            [self.view sendSubviewToBack:Image1];
        }
        else  {
           
            if (unlimitChange.on == YES)
                Image2.transform = CGAffineTransformScale(Image2.transform, xValueSlider.value
                                                          , yValueSlider.value);
            else
                Image2.transform = CGAffineTransformMakeScale(xValueSlider.value
                                                              , yValueSlider.value);
           
            if (unlimitChange.on == YES)
                Image2.transform = CGAffineTransformRotate(Image2.transform, rotationSlider.value*PI/180);
            else
                Image2.transform = CGAffineTransformMakeRotation(rotationSlider.value*PI/180);
           
            if (unlimitChange.on == YES)
                Image2.transform = CGAffineTransformTranslate(Image2.transform, XOffsetSlider.value, YOffsetSlider.value);
            else
                Image2.transform = CGAffineTransformMakeTranslation(XOffsetSlider.value, YOffsetSlider.value);

           
            Image2.alpha = transparentSlider.value;
           
            [self.view  addSubview:Image2];
            [self.view sendSubviewToBack:Image2];
        }
    }
       
       
    [UIView setAnimationDelegate:self];
    // 动画完毕后调用某个方法
    //[UIView setAnimationDidStopSelector:@selector(animationFinished:)];
    [UIView commitAnimations];
   
    if (change == 1)
        change = 2;
    else
        change = 1;
}
 
- (IBAction)XOffsetChange:(id)sender {
    XOffsetLabel.text = [NSString stringWithFormat:@"X偏移:%3.1f", XOffsetSlider.value]; 
}

- (IBAction)YOffsetChange:(id)sender {
    YOffsetLabel.text = [NSString stringWithFormat:@"Y偏移:%3.1f", YOffsetSlider.value];
}


4. 執行結果,顯示平移的結果