我正在编写一个名为“ animatePulseAtSpeed:completion:”的方法,该方法将使用一个完成块,该块将用于UIView“ animateWithDuration:delay:options:animations:completion :“调用此方法,如下所示。问题是我想在调用此完成块的同时添加我自己的一行来执行。例如,我可能只想在执行下面的UIView动画之后重新定位下面代码中提到的“rightPulse”UIView的帧。所以似乎UIView完成块是放置命令以重新定位“rightPulse”UIView帧的逻辑位置。但是如果我在UIView完成块中放置一行来重新定位帧,那么当它调用下面的方法时,我似乎失去了外部对象提供完成块的能力。似乎存在两个问题:或者我自己使用“ animateWithDuration ”完成块,或者我可以让外部对象提供完成块,但是我无法满足这两个需求。同一时间。
是否有任何优雅或简单的方法来修改下面的代码,以便我在调用此方法时让外部对象提供完成块但是我仍然可以向同一个完成块添加命令,这样它也可以执行我想要的额外动作(例如,同时重新定位“rightPulse”框架)?
我能想到的最佳解决方案是使用“ performSelector:withDelay ”方法重置“rightPulse”UIView位置,这样我就不需要使用“ animateWithDuration“完成块。但这似乎有点像kludge,因为完成块似乎是位置重置的自然场所。
- (void)animatePulseAtSpeed:(CGFloat)speed completion: (void(^)(BOOL finished)) completion {
…….
[UIView animateWithDuration:0.25
delay:1.0
options:UIViewAnimationOptionCurveEaseOut
animations:^{self.rightPulse.alpha=0.0;}
completion:completion]; }
答案 0 :(得分:3)
不要将completion
传递给animateWithDuration
。而是创建一个新块,在其中调用completion()
后跟您自己的命令,并将 传递给animateWithDuration
。
这是我自己的代码中的一个类似示例:
func displayActivityIndicatorWhileDoing (whatToDo : () -> ()) {
let act = UIActivityIndicatorView(activityIndicatorStyle: .WhiteLarge)
act.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds))
self.view.addSubview(act)
self.view.bringSubviewToFront(act)
act.startAnimating()
dispatch_async(dispatch_get_main_queue()) {
whatToDo()
act.removeFromSuperview()
}
}
那是Swift,而不是Objective-C,它不是动画块,但它是一个块(一个闭包)。我的想法是调用者将一个块传递给我,然后将该块包装在活动视图的显示中并将其命名为。因此,块意味着"这样做,加上你要添加的任何好吃的东西"。这正是你所描述的情况。