找出当前动画块的动画持续时间

时间:2012-04-05 07:51:30

标签: iphone animation uiview uiviewanimation

在UIView动画块中,有没有办法获取当前动画的持续时间?

[UIView animateWithDuration:1.0 animations:^{
    // float duration = ?
}];

5 个答案:

答案 0 :(得分:2)

TL; DR:使用CALayer -actionForKey :,而不是-animationForKey:

@Dimitri Bouniol的答案在动画片中受影响的二传手调用时对我不起作用。根据我的理解,原因是UIView的动画系统在开始实际动画之前设置状态(并在开始实际动画之前调用setter)。对我来说有用的是在图层上调用类似的-actionForKey:方法。返回的操作确实具有适当的持续时间设置,并且可以在他的答案中使用。

CAAnimation *animation = (CAAnimation*)
[self.layer actionForKey@"position"]; // or property of interest

[CATransaction begin];
[CATransaction setAnimationDuration:animation.duration];
[CATransaction setAnimationTimingFunction:animation.timingFunction];

// CALayer animation here

[CATransaction commit];

答案 1 :(得分:1)

[CATransaction animationDuration]是您正在寻找的

答案 2 :(得分:1)

您可以轻松获得当前动画。例如,设置CATransaction

CAAnimation *animation = [self.layer animationForKey:self.layer.animationKeys.firstObject];
[CATransaction begin];
[CATransaction setAnimationDuration:animation.duration];
[CATransaction setAnimationTimingFunction:animation.timingFunction];

// CALayer animation here

[CATransaction commit];

答案 3 :(得分:1)

如果您定位到 SELECT ds.disease_type as disease, SUM(CASE WHEN (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' THEN 1 ELSE 0 END) as patient_count, SUM(CASE WHEN ((DATE_FORMAT(pdm.visited_date, '%Y-%m-%d')) BETWEEN '2019-04-01' AND '2020-03-01') THEN 1 else 0 end) as disease_morbidity_cumulative_no, SUM(case when ic.age BETWEEN 0 AND 15 AND ic.gender ='male' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count1_male, SUM(case when ic.age BETWEEN 0 AND 15 AND ic.gender ='female' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count1_female, SUM(case when ic.age BETWEEN 16 AND 45 AND ic.gender ='male' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count2_male, SUM(case when ic.age BETWEEN 16 AND 45 AND ic.gender ='female' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count2_female, SUM(case when ic.age >45 AND ic.gender='male' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count3_male, SUM(case when ic.age >45 AND ic.gender='female' AND (DATE_FORMAT(pdm.visited_date, '%m-%Y'))='10-2019' then 1 else 0 end) as patient_age_count3_female FROM (p_d_m pdm) LEFT JOIN i_card ic ON ic.i_card_id = pdm.i_card_id LEFT JOIN disease ds ON ds.disease_id = pdm.disease_id LEFT JOIN village v ON v.village_id = ic.village_id LEFT JOIN phc p ON p.phc_id = v.phc_id LEFT JOIN ind_card indc ON indc.ind_card_id = pdm.ind_card_id LEFT JOIN block b ON b.block_id = p.block_id LEFT JOIN sub_district s ON s.sub_district_id =b.sub_district_id LEFT JOIN district d ON d.district_id = s.district_id GROUP BY ds.disease_id 或更高版本,那么您正在寻找iOS 9.0的类属性,称为UIView

用法:

inheritedAnimationDuration

来自 Apple文档

  

摘要

     

返回当前动画的继承持续时间。

     

讨论

     

如果在let currentAnimationDuration = UIView.inheritedAnimationDuration 动画块中调用此方法,则仅返回非零值。

答案 4 :(得分:0)

由于您正在使用块,为什么不用它来捕获变量?

CGFloat duration = 1.0;
[UIView animateWithDuration:duration animations:^{ 
    CGFloat theDuration = duration; 
}];