2014-12-19 46 views
1

我有下面這段代碼誰動我的UIView至左:移動一個UIView與起點

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [UIView beginAnimations:nil context:NULL]; 

     [UIView setAnimationDuration:4]; 

     int xOriginal = 91; 

     CGRect rect = imagem.frame; 

     int x = rect.origin.x; 
     int y = rect.origin.y; 
     int w = rect.size.width; 
     int h = rect.size.height; 

     if(x == xOriginal){ 

      imagem.frame = CGRectMake(x+100, y, w, h); 
     }else{ 

      imagem.frame = CGRectMake(x-100, y, w, h); 
     } 

     [UIView commitAnimations]; 

} 

我的我的看法的座標爲x = 91(SuperView把中心),當我開始我的應用我的UIView從左邊開始並轉到中間位置,而不是中間位置,然後轉到右側,爲什麼會發生這種情況?

如何使我的UIView開始在中心(x = 91)和向右(91 + 100),而不是左中心?

+0

你使用autolayout嗎?你把你的動畫放在你的controller -viewDidLoad方法中嗎?您還可能更喜歡使用其中一個'+ [UIView animateWith ...]函數 – Crazyrems 2014-12-19 10:56:10

+0

當您創建視圖時,您可能將其初始幀設置爲「錯誤」位置。請在您設置視圖的初始框架的位置顯示代碼。 – AMI289 2014-12-19 10:56:36

+0

我更新我的帖子,這是所有的代碼在我的應用程序(我的應用程序在這種情況下非常簡單..)我把我的代碼裏面viewdidload方法和我的看法是使用自動佈局。 – user3781174 2014-12-19 10:57:59

回答

1

自動佈局和幀動畫是不好的朋友。嘗試製作動畫約束,而不是直接對框架進行動畫處

您可以創建約束網點,並在代碼中設置約束的constant屬性以移動您的視圖。
您還可以致電-[view layoutIfNeeded]在動畫塊中刷新您的約束。

否則,您可以移除所有視圖約束並無所畏懼地爲其框架設置動畫。

+0

嘿人它的工作原理,我禁用AutoLayout和工作正常,現在圖像開始中心,並向右,而不是左中心,謝謝。 – user3781174 2014-12-19 11:14:26

+2

你可以用AutoLayout做動畫,但你必須使用不同的方法。不是直接爲視圖的位置設置動畫,而是改變視圖的約束。 – 2014-12-19 12:13:50

+0

@DuncanC你有一些教程,教如何動畫與自動佈局? – user3781174 2014-12-19 18:33:16

1
Initially image.frame = CGRectMake(91,100,20,20); 
So imageview starting point is 0 

[UIView animateWithDuration:5.0 
    animations:^{ 
    //Animation code goes here 
    image.frame = CGRectMake(191,100,20,20); //Now imageview moves from 0 to 100 
    } completion:^(BOOL finished) { 
    //Code to run once the animation is completed goes here 
}]; 
+0

儘管代碼是正確的,但並不直接回答他因爲他詢問將原點x的視圖移動到191,並且您的示例將它從最初的x從0移動到100.如果您要編輯它,它可能會作爲答案配對被排除在外。 – AMI289 2014-12-19 11:06:23

+0

yes編輯... @ AMI289 – madhu 2014-12-19 11:10:14

2
[UIImageView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ 
       imagem.frame=CGRectMake(imagem.frame.origin.x+100, imagem.frame.origin.y, imagem.frame.size.width, imagem.frame.size.height); 

    } completion:^(BOOL finished) { 
       //code for completion 
       NSLog(@"Animation complete"); 
      }]; 
1

正如另一張海報所說,您無法在使用AutoLayout的XIB /故事板中設置視圖的框架動畫。

相反,您必須動畫化一個附加到視圖的約束。

你要做的是創建一個約束(或多個約束)並將其連接到一個IBOutlet。然後,在您的動畫代碼中,計算約束的更改並更改相應約束的常量。例如,如果您想要移動視圖的垂直位置,請設置一個約束來設置視圖的垂直位置,並將其鏈接到名爲viewConstraint的IBOutlet。那麼你會使用這樣的代碼:

[myView animateWithDuration: .25 
    animations:^
    { 
    viewConstraint.constant -= shiftAmount; 
    [self.view layoutIfNeeded]; 
    } 
];