我的ViewController看起来非常庞大,现在有500多行代码。 我想重构它并将一些方法放入外部类或类别中。
但我的很多方法都涉及IBOutlets或UIViewAnimation,为Storyboard的View元素设置动画,隐藏它们,改变不透明度等等。
将此类方法移出ViewController的最佳方法是什么?
- (void)animateBeforeNewRound;
- (void)animateBeforeNewGame;
- (void)animateBeforeFinishingTheGame;
- (void)presentSlidingView;
- (void)presentSlidingView {
//preparing view constraint for animation
__block float constr = 0;
[self.view.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstItem == self.slideView && constraint.firstAttribute == NSLayoutAttributeLeading) {
constr = constraint.constant;
[constraint setConstant:0.0f];
}
}];
[UIView animateWithDuration:0.1 animations:^{
/* animate prepared constraint */
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
/* animate constraints */
[UIView animateWithDuration:0.1 delay:0.2 options:UIViewAnimationOptionTransitionNone animations:^{
self.imgBubble.alpha = 1;
} completion:^(BOOL finished) {
/* update constraints back to initial value */
[self.view.constraints enumerateObjectsUsingBlock:^(NSLayoutConstraint *constraint, NSUInteger idx, BOOL *stop) {
if (constraint.firstItem == self.slide && constraint.firstAttribute == NSLayoutAttributeLeading) {
[constraint setConstant:constr];
}
}];
[UIView animateWithDuration:0.1 delay:0.8 options:UIViewAnimationOptionTransitionNone animations:^{
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
self.imgBubble.alpha = 0;
}];
}];
}];
}
- (void)animate*
方法与- (void)presentSlidingView
非常相似,并与其他Storyboard的IBOutlets一起操作。
答案 0 :(得分:0)
通常,使用单独的对象来处理单独的任务是个好主意。例如,您可以创建一个Animator
类来处理所有-(void)animateXX
方法。
你可以为处理代表做同样的事情。我通常使用自定义实例来处理所有UITableViewDataSource
方法,因为它使我的Table View Controller类不那么杂乱。
关注点的分离对于将来的可维护性也很有用(例如:当你遇到与动画相关的问题时,你会发现第一个看起来就是你的动画师)。
Here是一篇关于此事的精彩文章。
答案 1 :(得分:0)
作为特定功能的建议:
为约束创建出口并且不要在代码中明确地搜索它们,对于这样的东西来说会更容易(对我来说):
self.slideViewLeadingConstraint.Constant = 0.0f;
为动画创建辅助函数;
尝试使用ReactiveCocoa和/或ReactiveAnimation,我认为这有助于将所有链接调用分开,代码看起来更整洁;