2013-05-17 60 views
1

我正在爲iPhone 5的更大屏幕更新iPhone應用程序,並且似乎存在與animateWithDuration:有關的問題。在我打開自動佈局之前,當UITextField成爲第一響應者時,界面元素會在屏幕上稍微向上移動,並在UITextField失去其第一響應者狀態時向下移動回原來的位置。現在,他們只是隨便飛起來,離開屏幕,我不知道爲什麼。我移動的對象與下面的代碼(這曾與自動版式關閉):AutoLayout和animateWithDuration問題

[UIView animateWithDuration:.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
    int offset = 160; 
    [object1 setFrame:CGRectMake(0, -offset, object1.frame.size.width, object1.frame.size.height)]; 
    [object2 setFrame:CGRectMake(object2.frame.origin.x, object2.frame.origin.y-offset, object2.frame.size.width, object2.frame.size.height)]; 
    [object3 setFrame:CGRectMake(object3.frame.origin.x, object3.frame.origin.y-offset, object3.frame.size.width, object3.frame.size.height)]; 
      } 
       completion:^(BOOL finished){}]; 

是否有事可做,試圖通過一個恆定移動的對象?即使當我將offset設置爲0時,所有對象仍然飛離屏幕。我嘗試過檢測設備具有哪個屏幕,並通過不同的量移動對象,但這也沒有奏效。有人有任何想法嗎?

在此先感謝!

+1

自動佈局和幀動畫相互衝突。我認爲這是iOS 6最大的錯誤(很多)。有關解決方案,請參閱我的書:http://www.apeth.com/iOSBook/ch17.html#_animation_and_autolayout – matt

回答

2

使用自動佈局時,除非這些對象是用translatesAutoresizingMaskIntoConstraints = YES手動添加到視圖的對象,否則自動佈局通常會阻止嘗試通過更改框架進行動畫。如果存在任何會導致約束被重新應用的位置,則對象將移回到約束條件應該在的任何位置,重寫您嘗試調整其屬性。

如果您在使用自動佈局動畫運動中的物體這樣,你會是(a)爲他們創造頂部約束的IBOutlet(如果調整y;如果調整x也一樣,你可以使用領先的約束也可以),然後更改該約束的constant屬性,然後在動畫塊內調用layoutIfNeeded;或者(b)消除約束並創建新約束。 (我通常做前者。)

有關如何創建IBOutlet進行約束,然後更改動畫塊中的constant屬性的示例,請參閱this answer的後半部分。