Mam blok animacji do wykonania prostej animacji opartej na transformacji, która po zakończeniu usuwa dany widok z jego podglądu.UIView blok animacji wstrzymuje zarówno animację, jak i kod zakończenia
UIView *msgView = [[UIView alloc] initWithFrame:CGRectMake(160, 120, 160, 100)];
// Do stuff to set up the subviews of msgView.
// Add the msgView to the superview (ViewController) that is going to display it.
CATransform3D transform = CATransform3DMakeScale(2.5, 2.5, 1.0);
[UIView animateWithDuration:5.0
animations:^(void){msgView.layer.transform = transform;}
completion:^(BOOL finished){[msgView removeFromSuperview];}];
I wtedy użyć kodu jak opisano przez Tech Q & A 1673 http://developer.apple.com/library/ios/#qa/qa1673/_index.html aby wstrzymać animację.
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
layer.speed = 0.0;
layer.timeOffset = pausedTime;
}
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer timeOffset];
layer.speed = 1.0;
layer.timeOffset = 0.0;
layer.beginTime = 0.0;
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
layer.beginTime = timeSincePause;
}
Jednak ten kod nie uniemożliwia wykonania kodu ukończenia. Tak aby zapobiec kod z wykonaniem zmienić kod zakończenia do tego:
completion:^(BOOL finished){if(finished == TRUE)[msgView removeFromSuperview];};
Podczas sprawdzania zakończeniu == TRUE zapobiega kod zakończenia od wykonywanego podczas gdy blok animacja jest wstrzymana. Jeśli czas trwania zostanie przekroczony przed "wznowieniem" animacji, kod zakończenia nie zostanie wykonany. tzn. w tym przypadku msgView pozostaje w superview.
Czy mimo to można wstrzymać/wznowić animację i zegar powiązany z kodem zakończenia (jeśli tak się dzieje)?
Interesujące pytanie. Może być interpretowany jako błąd w systemie iOS. Aby obejść ten problem, sugeruję, abyś pozbył się fragmentu ukończenia animacji, a zamiast tego stwórz własny NSTimer, którego aktualnym zakończeniem jest jego inwokacja. W ten sposób możesz zatrzymać timer wewnątrz warstwy pauzy (ustawiając fireDate daleko w przyszłości). Wewnętrzna wartość wznowieniowa, którą zresetował fireDate, aby była (timeSincePause + 5.0) – Rikkles
Miałem nadzieję dostać się bezpośrednio do CAMediaTiming związanej z kodem zakończenia, w taki sam sposób, w jaki robimy to z warstwą. Myślę, że byłoby to o wiele lepsze rozwiązanie. – VariableSquid
Napisałem testową aplikację pod iOS 6.1 i zachowuje się ona poprawnie, tzn. Zegar transformacji zatrzymuje się. W jakim systemie OS testujesz? – Rikkles