Используя macruby, как мне установить блок завершения для транзакции Core Animation? - PullRequest
2 голосов
/ 01 мая 2011

Я использую MacRuby для программирования Core Animation. Я перепробовал все, что мог придумать, и искал повсюду (и, возможно, этого нельзя сделать в «чистом» макруби), но я не могу понять, как указать блок кода MacRuby в качестве блока завершения, который нужно вызвать когда транзакция анимации завершена. Я знаю, что есть другие способы сделать то, что я хочу, но это, кажется, самое чистое для меня и то, как все движется в Какао. Во всяком случае, это то, что у меня есть:

CATransaction.begin  # start the transaction
#
# ...set up animation (works fine!)
#
CATransaction.setCompletionBlock(...)          <---- Here's the problem
CATransaction.commit  # end the transaction

Без строки 'setCompletionBlock' анимация работает нормально. Параметр этого метода установки определен (в Objective-C) как:

void (^)(void))block

И описывается как:

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

Я пробовал разные вещи (но на данный момент я только догадываюсь):

CATransaction.setCompletionBlock({ some code })

CATransaction.setCompletionBlock(Proc.new { some code })

CATransaction.setCompletionBlock(lambda { some code })

CATransaction.setCompletionBlock(method(:aMethod))
...
def aMethod
  ...
end

Я далеко? Должен ли я сделать оболочку Objective-C какого-то рода, чтобы сделать это? Или это не может быть сделано?

Заранее спасибо

1 Ответ

2 голосов
/ 02 мая 2011

Хорошо, после довольно окольного поиска в разбросанных заметках MacRuby я узнал, как это сделать.Конечно, это одно из моих ранних попыток решения; хитрость заключалась в установке (MacRuby) BridgeSupport Preview , которая отделена от установки MacRuby и о которой я до сих пор не знал и не нуждался.Надеюсь, что это поможет кому-то спасти процесс поиска ответа, который явно не связан с проблемой.Вот «полный» список моего исходного примера (см. Выше) с добавлением недостающего фрагмента:

CATransaction.begin  # start the transaction
#
# ...set up animation (works fine!)
#
CATransaction.setCompletionBlock( Proc.new { puts "I'm done!" })      <-------
CATransaction.commit  # end the transaction

, где оператор «put» может быть заменен желаемым кодом, который будет выполняться по завершении анимации.

Более общий ответ для , указывающий блок для метода Какао, заключается в использовании:

Proc.new { ...code block... }

в вызове метода (как указано выше).Аргументы также могут быть предоставлены, если они указаны в документации метода, используя обычный синтаксис определения блока ruby.

Предварительный просмотр MacRuby BridgeSupport можно загрузить с здесь (как MacRuby текущие и ночные выпуски).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...