Решение как анимация мусорной корзины - PullRequest
4 голосов
/ 16 ноября 2011

Я хотел бы добавить недокументированную анимацию корзины в мою программу. Вызов Метод:

+ (void)animateToolbarItemIndex:(unsigned)index duration:(double)duration target:(id)target didFinishSelector:(SEL)selector;

Может кто-нибудь выяснить, что я должен подключить для:

  • индекс
  • продолжительность
  • 1011 * целевой *
  • Селектор

Мои испытания не работают, что приводит к ошибке:

2011-11-15 16:05:20.639 CNiPhone[973:707] +[UIToolbar animateToolbarItemIndex:duration:target:didFinishSelector:]: unrecognized selector sent to class 0x3f019c08
2011-11-15 16:05:20.641 CNiPhone[973:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIToolbar animateToolbarItemIndex:duration:target:didFinishSelector:]: unrecognized selector sent to class 0x3f019c08'

Вот соответствующий код:

@interface UIToolbar (privateMethods2)

+ (void)animateToolbarItemIndex:(unsigned)index duration:(double)duration target:(id)target didFinishSelector:(SEL)selector;

@end

    [UIToolbar animateToolbarItemIndex:0 duration:0.5 target:trashToolbarButton didFinishSelector:@selector(animateTrashStep2)];
    [UIToolbar commitAnimations];

- (void) animateTrashStep2 {
}

Ответы [ 6 ]

3 голосов
/ 31 января 2012

Вам не нужно делать никаких недокументированных вещей для этого, просто создайте пользовательский UIButton.Скачайте UIKit Artwork Extractor , и вы найдете кадры для анимации корзины, а также фон UIBarButtonItem.

3 голосов
/ 16 ноября 2011

Вам нужно вызвать его на панели инструментов, подключенной к вашему IBOutlet, в отличие от класса. E.g.:

[self.myToolbar /*(possibly just myToolbar)*/ animateToolbarItemIndex:0 duration:0.5 target:trashToolbarButton didFinishSelector:@selector(animateTrashStep2)];
1 голос
/ 03 февраля 2012

Я думаю, что если вы знаете, как сделать suckEffect, то вы можете сделать немного взлома с помощью панели инструментов.

По сути, все официальные элементы управленияподкласс UIView , следовательно, вы можете узнать иерархию представлений экземпляра UIToolBar.

Если вы не знаете, как найти иерархию подпредставлений данного представления, вы можетеиспользуйте PRIVATE API - (void)recursiveDescription от UIView.Не забудьте использовать его в конфигурации DEBUG .

Почему мы должны беспокоить иерархию представлений?

Ответ: , чтобы скрыть определенное представление, илидобавить подпредставление , как мы хотим.

Что дальше

  1. Найти исходное представление UIBarButtonItem вашей корзины
  2. Перед запуском suckEffect скрыть его, добавьте новый мусорный бак, который может сделать анимацию открытия / закрытия / встряхивания .В этот момент я думаю, вам нужно попросить сделать анимацию open .
  3. Затем позвольте suckEffect летать ...
  4. После того, как suckEffect закончится, попросите ваше мнение сделать анимация закрытия .
  5. После завершения анимации закрытия удалите свой вид и заново отобразите исходный мусорный бак.

Возможность?

Я не делал этого раньше, но я думаю, что это возможное решение, потому что создать корзину можно с анимацией открытия / закрытия / встряхивания очень просто.

Риск?

В любом случае, этоРешение похоже на hacking without touching the private api, риск лежит на вас.

Удачи.

1 голос
/ 31 января 2012

Этот «недокументированный» метод описан здесь: http://iphonedevwiki.net/index.php/UIToolbar

Он задокументирован как метод экземпляра, а не как метод класса, который объясняет сообщение об ошибке, которое вы получаете в исключении.

@ jrtc27 правильно ответил на вопрос, так как вместо этого он должен быть отправлен в экземпляр UIToolbar.Из вашего ответа на комментарии кажется, что вы не изменили свою категорию классов, чтобы помочь компилятору.Вместо этого попробуйте следующее:

@interface UIToolbar (privateMethods2)
- (void)animateToolbarItemIndex:(unsigned)index duration:(double)duration target:(id)target didFinishSelector:(SEL)selector;
@end

А затем используйте:

[self.navigationController.toolbar animateToolbarItemIndex:0 duration:0 target:self.trashToolbarButton didFinishSelector:@selector(animateTrashStep2)];
1 голос
/ 30 января 2012

Это, вероятно, потому что ваша цель установлена ​​в trashButtonItem. Цель - это объект, на который будет отправлен didFinishSelector. Попробуйте установить цель для себя. Кроме того, согласно http://iphonedevwiki.net/index.php/UIToolbar это не метод класса, поэтому вам необходимо заменить [UIToolbar на фактический объект панели инструментов.

В вашем обратном вызове didFinishSelector, я полагаю, вы вызываете метод снова, и мусорная корзина закроется.

Удачи.

1 голос
/ 27 января 2012

Вы, вероятно, найдете ответ здесь: https://stackoverflow.com/a/5101910/796103

...