[英]Completion^ block not being called in UIView animation
我在這里想念什么嗎? 我希望imageview滑入,然后從屏幕底部滑出。
此外,這似乎將UIImageView放在導航欄的后面,如何制作CGRect使其適合導航欄下的屏幕?
_finga = [[UIImageView alloc] initWithFrame:CGRectMake(0, 88, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height-88)];
hiddenFrame = CGRectOffset(_finga.frame, 0, _finga.frame.size.height);
_finga.frame = hiddenFrame;
[self.view addSubview:_finga];
_finga.image = [UIImage imageNamed:@"Finga"];
[UIView animateWithDuration:2.0 animations:^{
_finga.frame = self.view.bounds;
}completion:^(BOOL done) {
if (done) {
NSLog(@"Complete!");
[UIView animateWithDuration:2.0 animations:^{
_finga.frame = hiddenFrame;
}];
}
}];
用來初始化_finga
會將其放在導航欄下面。 在動畫中,您正在將框架設置為視圖的邊界,這會將其置於條形后面,因為y值將為0。
您可以從一開始就通過使用此框架初始化_finga
來編寫更少的代碼:
CGRectMake(0,
self.view.bounds.size.height,
self.view.bounds.size.width,
self.view.bounds.size.height-88);
這將使視圖離開屏幕。 然后,將其添加為子視圖並設置其圖像后,將視圖動畫化回此框架:
CGRectMake(0,
88,
self.view.bounds.size.width,
self.view.bounds.size.height-88);
這會將視圖置於導航欄的正下方。 還考慮將所有硬編碼的88s替換為變量或#define
這樣您就可以更輕松地使用它,以防導航欄高度發生變化。
至於完成塊,請嘗試記錄@"Complete!"
在檢查done
是否為YES
之前輸入字符串,或在該處放置斷點以查看done
的值是done
。 您的動畫可能由於某種原因未完成,這可以解釋為什么未運行完成塊中的代碼。
但是,通常,如果您僅使用完成塊在第一個動畫之后運行另一個動畫,則根本不需要檢查已完成的BOOL
。 僅當程序中的其他內容取決於動畫的狀態時,這才至關重要。 例如,用戶可以單擊將某些內容設置為動畫的按鈕,然后將用戶帶到應用程序的其他部分。 但是,如果用戶取消動畫,則您可能根本不希望轉到其他部分,因此可以檢查done
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.