2013-04-02 197 views
2

我可能在做一些非常愚蠢的事情,但我不明白爲什麼這不起作用。UIView動畫iOS,Bizzarre

我想執行一個簡單的UIView塊動畫,但遇到了麻煩。我已經在一個測試項目中重新創建。

我在視圖控制器上有一個視圖,當我按下按鈕時,我創建一個新視圖並將其框架設置爲超出當前視圖(在其上方)。我想爲過渡設置動畫,以便當前在屏幕上的視圖向下移出視圖,因爲上面的視圖取代了它的位置。

這裏是一個被掛在按鈕的代碼, 原來的觀點是迷上了爲self.view1

- (IBAction)buttonPressed:(id)sender { 

    UIView *view2 = [[UIView alloc] init]; 
    view2.backgroundColor = [UIColor blueColor]; 
    float offScreenY = 0 - self.view1.frame.size.height; 
    CGRect offScreenRect = CGRectMake(0, offScreenY, self.view1.frame.size.width, self.view1.frame.size.height); 
    view2.frame = offScreenRect; 
    [self.view addSubview:view2]; 

    float oldY = self.view1.frame.origin.y + self.view1.frame.size.height; 
    CGRect oldRect = CGRectMake(0, oldY, self.view1.frame.size.width, self.view1.frame.size.height); 

    [UIView animateWithDuration:0.5 animations:^{ 
     self.view1.frame = oldRect; 
     view2.frame = CGRectMake(0, 0, self.view1.frame.size.width, self.view1.frame.size.height); 
    }]; 
} 

這只是動畫視圖2下來,沒有動畫視圖1.

如果我不要將視圖2作爲子視圖添加,只將視圖1的幀更改放入動畫塊中,然後view1正確地進行動畫。

但他們不會一起工作!

這是爲什麼?

+0

這可能是因爲oldRect與self.view1.frame相同。打印這兩個值,你會看到發生了什麼 – pdrcabrod

+0

嘗試完全相同的代碼,它在這裏工作得很好。必須有別的東西,你沒有在這裏展示... – omz

回答

1

這是啓用了自動佈局的典型症狀。如果您爲動畫效果frame設置了動畫效果,但它一旦自動佈局重新應用視圖上的約束,view1將返回到其原始位置。通過添加view2,iOS會立即自動重新應用自動佈局約束,因此您的view1將不會移動。底線,不要使用自動佈局,並嘗試直接動畫frame屬性。兩種解決方案:

  1. 簡單的解決方法是關閉自動佈局。如果你想保持自動佈局上,你不應該通過直接更改frame性質動畫

    enter image description here

  2. :進入IB中,選擇「文件檢查器」,取消選中「使用自動佈局」按鈕。您可以通過更改佈局約束常量來設置動畫。這已經在S.O.的其他地方得到了回答,但如果您需要關於該方法的指導,請告訴我。

    的基本理念,雖然是創建一個IBOutlet爲您的view1頂部約束叫,說,view1TopConstraint,然後在你的動畫塊,你可以說

    self.view1TopConstraint.constant += self.view1.frame.size.height; 
    [self.view layoutIfNeeded]; 
    

    對於這項工作,不過,你必須小心你在view1上的其他限制(例如,有一個高度限制,沒有底限制,或者如果你有限制,降低它的優先級等)。第一次做這件事可能會很麻煩,但通過更改約束條件,您很快就會獲得動畫效果。

    但是,如果您使用的是約束條件,那麼您可能不應該通過其frame定義view2,但可能也應該爲其定義約束條件。

+0

羅布,謝謝你的答案。你是對的,限制是前進的方向,「滑冰去哪裏」等。謝謝你的回答。關閉刷我的自動佈局! – Coxy1989

0

在這種情況下,最好有一個容器視圖。

相應地在此容器中添加view1和view2。容器的一些部分將在屏幕上,容器的框架尺寸將是視圖尺寸的兩倍。爲容器設置動畫,因此另外兩個視圖將相應地生成動畫。

+0

謝謝,這是我最終這樣做,我將它標記爲正確 – Coxy1989