Iphone 在XIB文件中处理动画的最佳实践,重复代码最少

Iphone 在XIB文件中处理动画的最佳实践,重复代码最少,iphone,objective-c,ios,cocoa-touch,Iphone,Objective C,Ios,Cocoa Touch,我有不同的UIViewController,其中包含从视图中出现和消失的组件(具有类似于平移的动画)。 我希望有一个类可以减少每个UIViewController中的代码量,并且可以在XIB文件中配置 因此,我的XIB文件包含: 需要在两个位置之间移动的组件(以下屏幕截图中为“我的视图”) vVisible:一个UIView,其作用类似于一个指示器,以表示可见位置 vHidden:一种UIView,其作用类似于一个指示器,以表示隐藏位置 以下是它在XCode中的外观: 我创建了一个Appe

我有不同的UIViewController,其中包含从视图中出现和消失的组件(具有类似于平移的动画)。 我希望有一个类可以减少每个UIViewController中的代码量,并且可以在XIB文件中配置

因此,我的XIB文件包含:

  • 需要在两个位置之间移动的组件(以下屏幕截图中为“我的视图”)
  • vVisible:一个UIView,其作用类似于一个指示器,以表示可见位置
  • vHidden:一种UIView,其作用类似于一个指示器,以表示隐藏位置
以下是它在XCode中的外观:

我创建了一个AppearingController(也是一个UIViewController)。它控制使零部件出现或消失的动画。它有3个IBOutlet属性:

IBOutlet UIView * vVisible;
IBOutlet UIView * vHidden;
IBOutlet UIView * v;
以及一个公共方法(仅用于在vVisible的rect和vHidden视图的rect之间运行动画):

因此,在我的UIViewController代码中,我只需要一些代码:

  • 在头文件中:要绑定到XIB的AppearingController实例的iboutlet/属性
  • 在实现文件中:我可以调用[self.appearingController showVisible:FALSE]来运行动画以隐藏/取消隐藏组件
和。。。它可以工作。 但我不太满意,因为我觉得它有点扭曲和沉重。因为:

  • AppearingController是一个UIViewController(我没有使用对象库中的对象或外部对象进行管理)
  • vVisible和vHidden是视图,但我不需要视图方法/功能。我只需要view.frame来指示位置
这种方法对你来说似乎是个好方法

你如何改进它

你是否有一些模式可以用来实现同样的目标

我很感兴趣


谢谢。

这看起来相当不错!实际上,您可以通过多种方式对其进行编码。但是,当谈到这个特定的示例时,您是否想要更好的编码方法并不重要。当你承担一个大得多的项目时,你必须设计你的数据结构和编码方案,这样你才能以最有时间限制和优化的方式完成它

例如,在一个大得多的项目中,您需要处理100个图像,您可以创建一个动画类,并相应地对它们进行子类化,然后引用它们或继承它们,这样您的方法既合乎逻辑又节省时间。希望你明白了

-(void) showVisible:(BOOL)visible {
CGRect frameDst = self.vVisible.frame;
if(!self.visible) frameDst = self.vHidden.frame;

CGPoint p = CGPointMake(CGRectGetMidX(frameDst), CGRectGetMidY(frameDst));
self.currentPosition = p;

CABasicAnimation *frameTranslation = [CABasicAnimation animationWithKeyPath:@"position"];
frameTranslation.toValue = [NSValue valueWithCGPoint:p];    
frameTranslation.duration = 0.40;
frameTranslation.repeatCount = 1;
frameTranslation.removedOnCompletion = NO;
frameTranslation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
frameTranslation.cumulative = NO;
frameTranslation.additive = NO;
frameTranslation.delegate = self;
[self.v addAnimation:frameTranslation forKey:@"position"];
}