2014-03-28 74 views
1

我正在動畫ImageView以將其向上移動。一切工作正常,但是當我呈現一個ViewController的時候,ImageView交換回原來的位置。保持動畫視圖的最後位置,同時呈現一個VC

我已經嘗試過在動畫完成時設置Frame,但它仍然回到原來的位置。

繼承人我做什麼:

-(void)viewDidLoad:(BOOL)animated{ 
    [super viewDidLoad:animated]; 
    [self performSelector:@selector(animationCode) withObject:nil afterDelay:0.1f]; 
} 

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
} 

//Animate welcome screen 
-(void)animationCode{ 
    CGRect imageFrame = self.imageViewLogo.frame; 
    [UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     self.imageViewLogo.center = CGPointMake(self.imageViewLogo.center.x, self.imageViewLogo.center.y-150); 
    }completion:^(BOOL finished){ 
     self.imageViewLogo.frame = CGRectMake(imageFrame.origin.x, imageFrame.origin.y-150, imageFrame.size.width, imageFrame.size.height); 
    }]; 
} 

任何想法如何解決這一問題?我認爲它有一些待辦事項與viewDissapering ..

+0

是否啓用了自動佈局功能? –

+0

是的,我需要它:S – SaifDeen

+0

使用自動佈局時不應設置任何框架 - 當需要重繪視圖時,子視圖將恢復到由其約束定義的位置,而不是您分配的新框架。您需要通過修改約束來進行移動或調整大小。 – rdelmar

回答

3

首先,你不應該在viewDidLoad動畫意見。你應該在viewWillAppearviewDidAppear開始動畫。

評論中提到的內容是正確的,當啓用自動佈局時,您不應該直接修改幀。出現的任何約束更新或佈局過程都會將幀重置爲其原始值。你應該做的是修改已有的約束條件。如果您在代碼中添加這些約束,可以將動畫所需的屬性保存爲屬性,並在動畫設置方法中對其進行修改。如果您在Interface Builder中設置了視圖,則可以在代碼中創建約束條件並以這種方式訪問​​它們。請記得在動畫塊中調用[self.view layoutIfNeeded]以實際觸發約束更新和佈局傳遞。

-(void)animationCode{ 
    CGRect imageFrame = self.imageViewLogo.frame; 
    [UIView animateWithDuration:1.5 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ 
     self.imageViewLogoYConstraint.constant -= 150; 
     [self.view layoutIfNeeded]; 
    } completion:nil]; 
} 

其中,imageViewLogoYConstraint是已經成立的地方約束的例子。

+0

我在IB再次查看了我的觀點。我沒有在Imageview上設置任何約束。 – SaifDeen

+0

@SaifDeen如果您不在Interface Builder中添加約束,則會爲您添加默認約束。這些默認約束條件是爲了保持它在原來的位置。您需要添加約束條件,因爲您無法將這些默認鏈接鏈接到插座。 –

+0

我試圖添加一個Y約束,但我無法在IB中找到正確的對齊約束... @ – SaifDeen

相關問題