Решение, похожее на анимацию мусорного бака

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

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

Кто-нибудь может понять, что я должен подключить для:

  • показатель
  • продолжительность
  • цель
  • селектор?

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

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 {
}

person T.J.    schedule 15.11.2011    source источник
comment
Это потому, что вы не хотите быть в App Store?   -  person David Dunham    schedule 16.11.2011
comment
Да, я понимаю, что этот метод не задокументирован. Одобрение Apple меня не касается.   -  person T.J.    schedule 16.11.2011
comment
Я уверен, что есть кто-то в стеке/переполнении, кто может опубликовать анимацию и изображения, которые решают эту проблему.   -  person T.J.    schedule 27.01.2012
comment
Комментарии Bounty: вопрос широко применим к большой аудитории. Для решения всех проблем требуется подробный канонический ответ. Я вижу, что этот вопрос был просмотрен более 100 раз. Я хотел бы, чтобы кто-нибудь опубликовал анимацию и изображения корзины, похожие на реализацию Apple, которые можно с уверенностью использовать в приложениях, предназначенных для App Store.   -  person T.J.    schedule 03.02.2012
comment
Неделя Bounty закончилась, и было опубликовано несколько хороших идей, но до сих пор нет готового рабочего решения. Я проголосовал за все ответы, потому что каждый из них дает некоторые подсказки, которые помогут любому, кто хочет продолжить это. Система присудит половину вознаграждения за ответ, получивший наибольшее количество голосов. Было бы ошибкой с моей стороны принять какой-либо один ответ на данный момент. Когда я разберусь с этим, я опубликую свое окончательное решение.   -  person T.J.    schedule 03.02.2012


Ответы (6)


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

person John Estropia    schedule 31.01.2012
comment
Могу ли я использовать эту иллюстрацию в проекте, который я планирую отправить в магазин приложений? Нужно ли указывать Apple или кого-либо из изображений? - person T.J.; 31.01.2012
comment
Боюсь, у вас есть правильное беспокойство здесь. Существует множество приложений, которые используют несколько встроенных изображений (в конце концов, вы можете получить изображения с помощью скриншотов), но в вашем случае вы используете целую анимацию, так что все зависит от вас. рецензент приложения. Вы же сказали, что одобрение Apple не проблема... - person John Estropia; 01.02.2012
comment
У меня было это в исходном вопросе, но я повысил требование к одобрению магазина приложений, когда я назначил награду за вопрос, потому что я думаю, что этот ответ будет иметь широкую популярность. - person T.J.; 01.02.2012
comment
В любом случае, это по-прежнему самый безопасный и элегантный метод, который вы можете использовать (если только вы не хотите рисовать свои собственные рамки изображений). Другие варианты, указанные здесь (на момент написания статьи), просто доставят вам больше проблем с рецензентами Apple. - person John Estropia; 02.02.2012
comment
После использования экстрактора иллюстраций я смог заставить его работать со ссылкой на grokkingcocoa.com/a-simple-way-to-animate-au.html. - person T.J.; 06.02.2012
comment
Я бы тоже так сделал. Удачи с магазином приложений! - person John Estropia; 06.02.2012

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

[self.myToolbar /*(possibly just myToolbar)*/ animateToolbarItemIndex:0 duration:0.5 target:trashToolbarButton didFinishSelector:@selector(animateTrashStep2)];
person jrtc27    schedule 15.11.2011
comment
Я пробовал это. Это часть контроллера навигационного представления, поэтому оператор выглядит следующим образом: [self.navigationController.toolbar animateToolbarItemIndex:0 duration:0 target:self.trashToolbarButton didFinishSelector:@selector(animateTrashStep2)]; Он не будет компилироваться, выдавая ошибку: тип получателя «UIToolbar», например, сообщение не объявляет метод с селектором «animateToolbarItemIndex:duration:target:didFinishSelector:» - person T.J.; 16.11.2011
comment
Похоже, ваш недокументированный метод задокументирован неправильно. Другими словами, если ни класс (как вы определили его в вопросе), ни экземпляр не отвечают, это неправильный селектор. - person David Dunham; 16.11.2011
comment
Это очень плохо. Это хорошая анимация. Если кто-то написал код и изображения для чего-то подобного, пожалуйста, опубликуйте! - person T.J.; 17.11.2011

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

person Christian Schnorr    schedule 27.01.2012
comment
Я ищу более полный ответ, имитирующий эффект отсоса и открытие и закрытие крышки мусорного бака. - person T.J.; 27.01.2012
comment
Мусорная корзина сама по себе не является настоящей анимацией UIView, это скорее набор изображений, объединенных для имитации красивой анимации. - person Christian Schnorr; 28.01.2012

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

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

Удачи.

person Justin    schedule 30.01.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)];
person ikuramedia    schedule 31.01.2012
comment
Сделал как вы сказали и работает без ошибок, но анимации нет и селектор не вызывается. Это мое утверждение: [self.navigationController.toolbar animateToolbarItemIndex: 4 продолжительность: 2 target: self didFinishSelector: @ selector (animateTrashStep2)]; Кроме того, я не знаю, что вы имеете в виду, кажется, что вы не изменили свою категорию класса, чтобы помочь компилятору. Как мне это сделать? - person T.J.; 31.01.2012
comment
(privateMethods2) — это «категория» в классе UIToolbar. Он позволяет расширять существующие классы новыми методами. В этом случае метод уже существует, но компилятор не знает о нем, поэтому он не будет компилироваться. Первый фрагмент кода, который я разместил, - это «исправление». Я не уверен, почему он не анимируется, может быть, индекс неверный? - person ikuramedia; 01.02.2012
comment
Я использовал NSLog, чтобы выдать индексы всех кнопок, так что я уверен, что понял правильно. Возможно, мне нужно включить библиотеку? Удалось ли вам заставить его анимироваться? - person T.J.; 01.02.2012

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

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

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

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

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

Что дальше

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

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

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

Риск?

Так или иначе, это решение похоже на какое-то hacking without touching the private api, риск на свой страх и риск.

Удачи.

person Tonny Xu    schedule 03.02.2012