Как мне настроить блок завершения для транзакции Core Animation с помощью macruby?

Я использую 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 для этого? Или это невозможно?

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


person Zhora    schedule 01.05.2011    source источник


Ответы (1)


Хорошо, после довольно окольного путешествия в поисках разрозненных заметок 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).

person Zhora    schedule 02.05.2011