UIButton子类:在自定义动画完成后调用[super touchesEnded:]

问题描述:

我有一个UIButton子类,它执行一些自定义绘图和动画。这一切都工作正常和丹迪。UIButton子类:在自定义动画完成后调用[super touchesEnded:]

但是,我的大多数按钮通过调用[self dismissViewControllerAnimated]忽略当前视图,一旦确认模型无论按钮按下是否应该完成,我都希望有一个延迟在解散视图之前允许动画完成。

我能够很容易地在touchesEnded上为UIButton子类创建动画,然后调用[super touchesEnded],它可以正常工作,但它不会让我的动画在关闭视图之前完成。就像这样:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CABasicAnimation *myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.foo"]; 
    //set up myAnimation's properties 

    [self.layer addAnimation:shakeAnimation forKey:nil]; 
    [super touchesEnded:touches withEvent:event]; //works! but no delay 
} 

我为了创建延迟第一次尝试通过使用CATransaction如下:

其中,据我所知,在执行CATransaction的completionBlock,但它只是ISN什么都不做。

我也试着将touchesEnded中的touches和event参数赋值给属性和全局变量,然后在由NSTimer调用的另一个方法中执行[super touchesEnded]。同样的事情似乎发生在代码执行的地方,但是我对[super touchesEnded]的调用没有做任何事情。

我在网上挖了好几个小时。从UIResponder添加其他触摸方法的存根,其中只包含[super touches ...]。尝试为NSTimer调用的方法设置我的全局变量(我很可能错过了关于全局变量的一些东西......)。这个按钮是由Storyboard创建的,但是我已经将类设置为我的自定义类,所以我不认为UIButton的+(UIButton *)buttonWithType方法正在影响这个。

我错过了什么?是否有一些我忘记的小事或者是没有办法延迟从UIButton子类中调用[super touchesEnded]?

我无法解决这个问题,只能找到解决办法。

我最后一次解决这个问题的方法是找出在完成块中的[super touchesEnded ...]是否在一个线程中执行,该线程与它在完成块之外时执行的线程不同...并且不,它们都是主线程(Apple的关于CATransaction的文档确实说明它的completionBlock总是在主线程中运行)。

所以,如果有人在敲打他们对这个头,这是我不那么优雅的解决方案:

1)在我的UIButton的子类,我创建了一个微弱的属性称为containingVC。

2)在使用了自定义按钮我不得不这样做的每一个(啊)VC:在我的自定义的UIButton类

@implemenation VCThatUsesCustomButtonsOneOfWayTooMany 

-(void)viewDidLayoutSubviews 
{ 
    [super viewDidLayoutSubviews]; 
    self.firstCustomButton.containingVC = self; 
    self.secondCustomButton.containingVC = self; 
    self.thirdCustomButton.containingVC = self; 
    .... 
    self.lastCustomButton.containingVC = self; 
    //you're probably better off using an IBOutletColletion and NSArray's makeObjectPerformSelector:withObject... 
} 

@end 

3)然后,我有这样的事情:

-(void)animateForPushDismissCurrView 
{ 
    CAAnimation *buttonAnimation = ...make animation 

    [CATransaction begin]; 
    [CATransaction setCompletionBlock:^{ 

     [self.containingVC performSegueWithIdentifier:@"segueID" sender:self.containingVC]; 

    }]; 
    [self.layer addAnimation:buttonAnimation forKey:nil]; 
    [CATransaction commit]; 
} 

4。)然后,在用户正在与之交互的任何VC中,在确定按钮完成了它应该做的任何事情之后(在我的情况下,它会检查模型以确认相关的更改已经完成),每个按钮必须调用[someCustomButton animateForPushDismissCurrView]然后动画按钮按下,然后触发UIStoryboardSegue实际上消除视图。

很明显,这将工作更深入,不只是展开,但你需要额外的逻辑在自定义按钮的 - (无效)animateForPush方法或完全独立的方法。

再一次,如果我在这里错过了一些东西,我很想知道它是什么。这看起来像是一个荒谬的数字,可以跳过去完成看似简单的任务。

最后,也是最重要的一点,如果它不能用于CATransaction的completionBlock中的[super touchesEnded ...]方法,我想知道为什么。我怀疑它与线程或Objective-C的超级关键字的怪异性有关。