2016-11-01 32 views
2

我有一個包含兩個視圖的視圖控制器。我需要的是,在視圖控制器被推動後,頂部視圖(_sidepanelview)向左移動消失在屏幕上。屏幕出現動畫視圖出錯ios

這裏是我寫的:

-(void)viewDidAppear:(BOOL)animated{ 
    CGRect newsidepanelviewposition = _sidepanelview.frame; 
    newsidepanelviewposition.origin.x = -_sidepanelview.frame.size.width; 


    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ 
     _sidepanelview.frame = newsidepanelviewposition; 

    } completion:^(BOOL finished) { 
     NSLog(@"Done!"); 

    }]; 
} 

的問題是,當我運行的應用程序,視圖控制器被推遲後,視圖_sidepanelview從屏幕上消失,再次出現的中心屏幕從右側而不是從x = 0向左移動到x = -_sidepanelview寬度從屏幕消失。

我在做什麼錯了?

注:我做了自動佈局取消選中的應用程序和動畫工作正常,但使用它與自動佈局打開它嚇壞了!

回答

1

由於您的note暗示,自動佈局是「罪魁禍首」。 您的視圖具有由AutoLayout引擎定期執行的約束。當您更改視圖的frame時,框架會改變,但不會改變視圖的佈局約束。當下一個週期layoutSubviews發生時,您的視圖位置和大小(即frame)將重置爲約束要求。

如果要爲該視圖/ viewcontroller包含AutoLayout,請使用約束更改來執行動畫。

這裏的黃金法則是,setFrame是AutoLayout的對立面。

示例代碼

-(void)viewDidAppear:(BOOL)animated { 

    _sidePanelLeadingSpace.constant = -_sidepanelview.frame.size.width; // 1 

    [UIView animateWithDuration:0.5 delay:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{ 

     [self.view layoutIfNeeded]; // 2 


    } completion:^(BOOL finished) { 
     NSLog(@"Done!"); 

    }]; 
} 
  1. 有一個參考,_sidePanelLeadingSpaceNSLayoutConstraint),以的_sidepanelview前導間隔約束,對於例如作爲一個IBOutlet。
  2. 改變約束的constant和佈局通過在動畫塊調用layoutIfNeeded認爲
+0

你能告訴我如何使用SETFRAME矛盾決定哪些約束在故事板? – Falcoa

+0

我的意思是,'setFrame'本質上與AutoLayout相矛盾,因爲幀更新不會更新約束。如果你使用AutoLayout,不要使用'setFrame' - 總是隻更新約束。 我用一些示例代碼更新了我的答案。 –

+0

在我的情況下,我只是使用約束來將容器中的X和Y中的_sidepanelview居中。我應該如何更新約束?我看到你用例如leadingSpace約束。 – Falcoa