2015-07-19 1 views
1

У меня есть подкласс UIButton, который выполняет некоторые пользовательские рисования и анимации. Все это прекрасно работает и денди.Подкласс UIButton: вызов [super touchesEnded:] После завершения пользовательских анимаций

Тем не менее, большинство моих кнопок отклоняют текущий вид через свой супервизор, вызывая [self rejectViewControllerAnimated], как только он подтверждается моделью, что все, что должно было сделать нажатие кнопки, было сделано, и я хочу, чтобы там была задержка чтобы анимация завершилась, прежде чем отклонить представление.

Я могу легко анимировать подкласс UIButton на touchEnded, а затем вызвать [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 следующим образом:

Который, насколько я могу судить, выполняет completionBlock CATransaction, но это просто ISN ничего не делаю.

Я также попытался назначить аргументы касаний и событий от touchEEded к свойствам и глобальным переменным, а затем выполнить [super touchesEnded] в другом методе, вызванном NSTimer. То же самое происходит, когда код выполняется, но мой вызов [super touchesEnded] ничего не делает.

Я выкопался через Интернет в течение нескольких часов. Добавлены заглушки других методов касания от UIResponder, которые просто содержат [super touch ...]. Пробовал настраивать мои глобальные переменные для метода, называемого NSTimer по-разному (я очень хорошо могу что-то пропустить в отношении глобальных переменных ...). Эта кнопка создается раскадкой, но я установил класс в свой собственный класс, поэтому я не думаю, что метод кнопки UIButton + (UIButton *)WithType влияет на это.

Что мне не хватает? Есть ли какая-то небольшая вещь, о которой я забываю, или нет способа отложить вызов [super touchesEnded] из подкласса UIButton?

ответ

1

Я не мог решить это, только найти способ вокруг него.

Последний мой удар при решении этого вопроса заключался в выяснении того, выполнялся ли [super touchesEnded ...] внутри блока завершения в потоке, отличном от потока, который был выполнен, когда он находился вне блока завершения ... и нет, они оба кажутся основным потоком (документация Apple по CATransaction заявляет, что ее завершающий блок всегда запускается в основном потоке).

Таким образом, в случае, если кто-то стучит головой против этого, вот мой менее чем элегантное решение:

1.) В моем подклассу UIButton я создал слабое свойство containingVC.

2.) В каждом отдельном (тьфу) VC, который использует пользовательский класс кнопки я должен сделать это:

@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.) Тогда в моем классе пользовательских UIButton у меня есть что-то вроде этого:

-(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 пользовательской кнопки (void) или в отдельном методе.

Опять же, если мне что-то не хватает, я бы хотел узнать, что это. Это похоже на абсурдное количество обручей, чтобы проскочить, чтобы выполнить то, что кажется простой задачей.

Наконец, и самое главное, если он просто не будет работать с методом [super touchesEnded ...] в завершении завершения CATransactionBlock, я хотел бы знать ПОЧЕМУ. Я подозреваю, что это имеет какое-то отношение к потокам или странности, которая является ключевым словом Objective-C.

 Смежные вопросы

  • Нет связанных вопросов^_^