Ios 自定义的、可重用的动画代码应该去哪里?

Ios 自定义的、可重用的动画代码应该去哪里?,ios,animation,design-patterns,core-animation,cocoa-design-patterns,Ios,Animation,Design Patterns,Core Animation,Cocoa Design Patterns,概述:我目前有一个实现自定义动画逻辑的自定义UIView子类,我不确定view类是否是放置该代码的最佳位置 我正在用Swift制作一个iOS应用程序,它使用一个UIView子类,我称之为DoorView。门视图表示滑动门,该滑动门响应于滑动手势,执行滑动动画以打开 这是我现在拥有的完整动画: 为了保持视图控制器的亮度,我将处理这些动画的实际核心动画代码放入了我的DoorView类中。My View Controller通过检查手势是否与打开给定门所需的手势匹配来处理该手势,如果匹配,则在Doo

概述:我目前有一个实现自定义动画逻辑的自定义UIView子类,我不确定view类是否是放置该代码的最佳位置

我正在用Swift制作一个iOS应用程序,它使用一个UIView子类,我称之为DoorView。门视图表示滑动门,该滑动门响应于滑动手势,执行滑动动画以打开

这是我现在拥有的完整动画:

为了保持视图控制器的亮度,我将处理这些动画的实际核心动画代码放入了我的DoorView类中。My View Controller通过检查手势是否与打开给定门所需的手势匹配来处理该手势,如果匹配,则在DoorView上调用open()方法

因此,在ViewController中:

@IBAction func swipe(sender: UISwipeGestureRecognizer) {
        if (sender.direction.rawValue == currentDoorView.door.swipeDirection.rawValue) {
            self.currentDoorView.open()
        }
    }
下面是我的DoorView类中的open()方法: 注意:这只是滑动动画,将来将使用滑动类型检查来区别于其他类型的门(例如铰链门)

那么,可以将动画逻辑放在视图类中吗?这是我的第一反应,因为a)这些动画是我的门视图特有的,b)因为animateWithDuration是UIView的一个类方法,所以动画由视图/视图类自己处理似乎有一些先例

但我会继续开发我的应用程序,我会用自己的动画添加更多的门类型,我担心DoorView会因为动画代码而变得太胖。在这一点上,我是否应该简单地开始创建DoorView子类(即SlidingDoorView、HingedDoorView等)


或者视图动画应该由视图控制器处理?除了VC膨胀之外,我的问题是,如果我想在其他视图控制器中使用DoorViews,我需要复制代码。通过这种方式,我的门视图附带了自己的动画,我的VCs只需调用open()。

我认为有两种选择可以实现,而且两者都可以接受

1。使用extension将动画代码与门视图代码分开

在主DoorView类中为门类型添加一个新枚举,以便知道它是什么类型的门

然后创建一个新的swift文件,将其命名为DoorAnimation.swift并放入:

extension DoorView {
  func open(withDuration duration: CFTimeInterval = 1.0) {
    switch doorType {
      case .Hinged:
        openHingedDoor(duration)
      case .Sliding:
        openSlidingDoor(duration)
    }
  }

  func openSlidingDoor(withDuration duration: CFTimeInterval = 1.0) {
    // Enter the custom code 
    // You can call use self to access the current door view instance
  }

  func openHingedDoor(withDuration duration: CFTimeInterval = 1.0) {
    // Enter hinged door animation code
  }
}
2。子类DoorView

在DoorView中创建一个函数:

func open() {
  print("WARNING: This requires an override.")
}
然后在每个子类中重写open()


这两种结构各有优缺点。我想说,如果门没有做太多的选择1是伟大的。如果它们有很多功能,那么最好执行选项2。

漂亮的动画。听起来每个动画都应该是自己的类。它的子类取决于需要重用的代码。啊,很有趣!谢谢你的回复。在这种情况下,将在哪里调用动画?我仍然会在我的DoorView类中处理这些动画方法调用,还是在视图控制器中处理会更有意义?如果可以将它们封装在视图类中,它们将更易于在其他控制器中使用。非常好,这也是我的直觉。感谢您的回复!因此,需要明确的是,关于总体设计模式/SoC:视图包含这种逻辑是可以接受的吗?就代码组织而言,您的两个建议都很好,但都涉及最终实现自己动画的视图。我只是想确定那是犹太的。编辑:这与原帖子上的评论员提出的单独动画类的建议相矛盾,不是吗?将动画放在视图类本身是可以接受的。大多数情况下(也有例外),视图都有自己的动画类型。但是,如果您正在执行组动画之类的操作,例如使用[View]数组使一组视图淡出,则应在基本视图类上使用扩展,并创建静态函数淡出(视图:[View]){}类型函数。所以有一些模糊的线条。
func open() {
  print("WARNING: This requires an override.")
}