Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 将Cocoa动画融入MVC/OOP模式_Cocoa Touch_Animation_Uiview_Uiviewcontroller - Fatal编程技术网

Cocoa touch 将Cocoa动画融入MVC/OOP模式

Cocoa touch 将Cocoa动画融入MVC/OOP模式,cocoa-touch,animation,uiview,uiviewcontroller,Cocoa Touch,Animation,Uiview,Uiviewcontroller,MVC/OOP设计模式表示您不设置属性,本质上,您要求对象设置其属性。类似地,在Cocoa中,您不会告诉对象何时绘制自身。您的对象的代码已经详细说明了它将如何绘制自己,因此我们相信框架可以决定它应该在什么时候(大部分情况下)绘制 但是,对于Cocoa中的动画(特别是Cocoa Touch),我们现在似乎必须控制对象从“对象视图”控制器中绘制自身的时间。我无法向UIView子类发送消息,要求它更改某些值,然后让它知道它将缓慢(持续时间=X)将自身设置为新位置、alpha、旋转等,具体取决于属性的更

MVC/OOP设计模式表示您不设置属性,本质上,您要求对象设置其属性。类似地,在Cocoa中,您不会告诉对象何时绘制自身。您的对象的代码已经详细说明了它将如何绘制自己,因此我们相信框架可以决定它应该在什么时候(大部分情况下)绘制

但是,对于Cocoa中的动画(特别是Cocoa Touch),我们现在似乎必须控制对象从“对象视图”控制器中绘制自身的时间。我无法向UIView子类发送消息,要求它更改某些值,然后让它知道它将缓慢(持续时间=X)将自身设置为新位置、alpha、旋转等,具体取决于属性的更改。或者我可以吗

基本上,我正在寻找一种方法来设置属性,然后离开。相反,我似乎需要包装调用对象的代码,要求它使用某种类型的动画块更改其属性“[UIView beginAnimations:nil context:NULL];…[UIView commitAnimations];”


我的视图控制器中有很多动画块,而视图对象中没有动画块……我想我只是在找人来验证这是如何完成的,我没有忽略什么。我没有比Cocoa Touch中的UIView动画走得更远,所以这可能是我的问题,是时候深入挖掘了

UIView在默认情况下不会像CALayer那样设置其属性更改的动画,这是正确的,但我认为这并不意味着MVC的中断。控制器可以指示视图如何变换。这无疑是控制器类的角色,因为控制器知道视图的正确框架,甚至管理布局都是合适的。我同意,在UIView类上而不是在实例上调用
-beginAnimations:context:
有点奇怪,但实际上,这样做的效果要好得多,因为您可能希望同时为多个视图设置动画

也就是说,如果您有一个UIView子类来管理其子视图的布局,那么允许该UIView管理动画而不是依赖UIViewController来管理动画没有什么错。这是一个可以在任何地方运行的东西,但实际上,正如您所发现的,它通常在控制器中运行


我在这里使用的是典型意义上的“MVC”。您是对的,这在SmallTalk程序中可能不合适,但是它的角色非常有限(管理用户输入事件)。Cocoa极大地扩展了MVC中控制器的作用,我认为这是一种改进,即使这意味着现在有一些功能可以放在控制器或视图中(这就是其中之一)。

我对CALayers没有太多了解。不确定他们是否会在这里帮助我。很抱歉我的困惑…但我有一个UIView子类。我想知道是否可以设置一些状态(比如fillColor=greenColor),然后“走开”。此uiview知道如何绘制自身,并将用绿色填充其路径,但不会设置该更改的动画。它只是瞬间变绿。我能找到的唯一方法是在VC中设置动画块。你可以通过请求UIView的层进行更改(aView.layer.backgroundColor)来获得你想要的,因为该层将自动设置动画。也就是说,设置动画块没有错。在我看来,这违反了MVC原则,不幸的是,在cocoa touch中这是不可避免的。控制器应该决定视图何时更改,而不是如何更改,因为这是视图的责任。@adrin,在MVC中画线有很多方法,这只是其中之一。将视图子类化以使其具有不同的动画效果并不是MVC的一种更好的形式(如果您愿意,Cocoa也不会阻止您这样做)。在SmallTalk MVC中,类似NSTextField的视图不会处理自己的键盘输入,因为这是控制器的工作。我很高兴NeXT选择了一种不同的方式来实现MVC。有很多方法可以做到这一点,在控制器中定义动画是完全有效的,并且允许动画本身独立于任何特定视图进行重用。