处理XIB文件中的动画并使用最少重复代码的最佳实践

时间:2011-12-26 22:50:44

标签: iphone objective-c ios cocoa-touch

我有不同的UIViewController,它包含从视图中出现和消失的组件(带有像translation movment这样的动画)。 我希望有一个类可以减少每个UIViewController中的代码量,并且可以在XIB文件中进行配置。

所以我的XIB文件包含:

  • 需要在两个位置之间移动的组件(在以下屏幕截图中为“我的视图”)
  • vVisible:一个UIView,用作表示可见位置的指示符
  • vHidden:一个UIView,用作表示隐藏位置的指示符

以下是XCode中的内容:

enter image description here

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

IBOutlet UIView * vVisible;
IBOutlet UIView * vHidden;
IBOutlet UIView * v;

一个公共方法(只是在vVisible的rect和vHidden视图的rect之间运行动画):

-(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"];
}

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

  • 在头文件中:要绑定到XIB的AppearingController实例的iboutlet /属性。
  • 在实现文件中:我可以调用[self.appearingController showVisible:FALSE]来运行动画来隐藏/取消隐藏组件

并且......有效。 但我不太满意,因为我觉得它有点扭曲和沉重。因为:

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

这种方法似乎对你有好处吗?

你怎么能改善它?

你是否有一些模式用于实现同样的目标?

我很感兴趣

感谢。

1 个答案:

答案 0 :(得分:0)

这看起来还算不错!您可以通过多种方式对此进行编码。但是当谈到这个具体的例子时,如果你想要一个更好的编码方法并不重要。当你开展一个更大的项目时,有必要设计你的数据结构和编码方案,以便你能够以最大的时间约束和优化的方式完成它!

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