簡體   English   中英

未在UIView動畫中調用Completion ^塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM