设置animationDidStopSelector:在UIView的动画委托上

Jas*_*ien 5 iphone animation delegates uiview

我想我过去一年半的iPhone开发经历一直都是这样做的...我可以使用一些知识渊博的澄清!

正如您可能知道或不知道的那样,使用该beginAnimations:forContext:方法可以很容易地动画UIView属性,并通过commitAnimations调用将其包装起来.

您还可以设置动画委托,以便在动画的某些部分出现时执行操作,例如开始,结束等.

我已经在我的代码中使用了UIView动画很长一段时间并且从来没有遇到任何严重的问题,但我只是遇到了一些我一定错过的文档部分.

UIView的文档setAnimationDidStopSelector:声明传入此方法的任何选择器应采用以下形式:

- (void)animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;
Run Code Online (Sandbox Code Playgroud)

我根本没有这样做过.我一直在设置不带参数的普通旧doThisdoThat类型选择器.

我一直在接受什么?我应该重写我的所有代码以使用记录的表单吗?或者,如果我需要知道动画是否在停止之前完成或者需要将一些特定于上下文的数据传递给方法,那么这个形式是为了方便吗?

ken*_*ytm 9

这是可以接受的.


在汇编级别,调用Objective-C方法

id something = [obj method:arg0 and:arg1 also:arg2 asWellAs:arg3];
Run Code Online (Sandbox Code Playgroud)

看起来像(不是真正的ARM代码):

load  r0      <- obj
load  r1      <- @selector(method:and:also:asWellAs:)
load  r2      <- arg0
load  r3      <- arg1
load  [sp, 0] <- arg2
load  [sp, 4] <- arg3
call          objc_msgSend
store r0      -> something
Run Code Online (Sandbox Code Playgroud)

其中,objc_msgSend将保留所有的寄存器,发现-method:and:also:asWellAs:,并跳转到它.在-method:…编译器内将参数关联回寄存器,即

store r0        -> self
store r1        -> _cmd
store r2        -> param0
store r3        -> param1
store [sp, ?]   -> param2
store [sp, ?+4] -> param3
// rest of execution
Run Code Online (Sandbox Code Playgroud)

现在如果你的方法只是-doThis或者会发生什么-doThat

store r0        -> self
store r1        -> _cmd
// rest of execution
Run Code Online (Sandbox Code Playgroud)

没有参数,因此寄存器r2,r3和堆栈值可以自由覆盖.换句话说,编译器/运行时将简单地忽略额外的参数.

只有在占用太多参数时才会出现问题.