我有一个简单的视图控制器。视图控制器使用动画。如果我正在显示列表,它将动画到地图。那时它也会将指向地图的按钮改为指向列表。
因此,通过按住同一个按钮(实际上是 2 个不同的按钮,但用户将其视为同一个按钮),用户可以不断地从地图切换到列表,反之亦然。
工作正常。有一些捕捉。
如果用户点击太快怎么办?假设我希望我的应用程序确实被使用,那么罐头或惩罚它们不是一种选择。
这是当前程序:
-(void) transitiontoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL))completion1
{
[self enableButtonWithBool:false];
UIViewController * fromController = self.last2ViewsInTheContainer.lastObject;
if (fromController.view.superview!= self.ContainerView)
{
return;
}
[self transitionFromViewController:fromController toViewController:toViewController duration:duration options:options animations:animations completion:^(BOOL finished) {
if (completion1 == Nil) //can't execute nil block. can be more elegantly done with [completion1 invoke] if there is such function. Anyway, do nothing if completion1 is nil
{
}
else
{
completion1 (finished);
}
[self.last2ViewsInTheContainer addObject:toViewController];
if (self.last2ViewsInTheContainer.count>2)
{
[self.last2ViewsInTheContainer removeObjectAtIndex:0];
}
}];
[self enableButtonWithBool:true];
[self ReloadorRedraw];
}
简单的过渡。我只想在函数的末尾指出 2 个控制器视图具有相同的子视图。在函数结束时,转换似乎尚未完成。旧的视图控制器并没有真正删除,等等。
ReloadorRedraw 的内容如下:
-(void)ReloadorRedraw;
{
BGCRBadgerStandardViewViewController * listOrMap = nil;
if ([self.last2ViewsInTheContainer lastObject]==self.filterController)
{
[self.changeFilterButton setBackgroundImage:[UIImage imageNamed:filterBarOpenImageString] forState:UIControlStateNormal];
listOrMap = self.last2ViewsInTheContainer[0];
}
else
{
[self.changeFilterButton setBackgroundImage:[UIImage imageNamed:filterBarCloseImageString] forState:UIControlStateNormal];
listOrMap = self.last2ViewsInTheContainer.lastObject;
}
if (listOrMap==self.listBusinessViewController)
{
self.navigationItem.rightBarButtonItem=self.mapButton;
}
else
{
self.navigationItem.rightBarButtonItem=self.listButton;
}
}
如果我点击得太快,我会收到以下消息:不平衡调用开始/结束外观转换。开始/结束外观转换的不平衡调用。
之后应用程序处于无效状态。
补救这种情况的一种方法是“禁用”按钮,直到动画完成。
-(void) transitiontoViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL))completion1
{
[self enableButtonWithBool:false];
UIViewController * fromController = self.last2ViewsInTheContainer.lastObject;
if (fromController.view.superview!= self.ContainerView)
{
return;
}
[self transitionFromViewController:fromController toViewController:toViewController duration:duration options:options animations:animations completion:^(BOOL finished) {
if (completion1 == Nil) //can't execute nil block. can be more elegantly done with [completion1 invoke] if there is such function. Anyway, do nothing if completion1 is nil
{
}
else
{
completion1 (finished);
}
[self.last2ViewsInTheContainer addObject:toViewController];
if (self.last2ViewsInTheContainer.count>2)
{
[self.last2ViewsInTheContainer removeObjectAtIndex:0];
}
[self enableButtonWithBool:true];
[self ReloadorRedraw];
}];
}
基本上我在搬家
[self enableButtonWithBool:true];
[self ReloadorRedraw];
到完成块。
函数 enableButtonWithBool 就是这个简单的函数:
-(void)enableButtonWithBool: (BOOL) enable
{
self.mapButton.enabled=enable;
self.listButton.enabled= enable;
self.changeFilterButton.enabled =enable;
self.searchBar.enabled =enable;
}
这很好用。
我的伴侣不喜欢它。那是因为禁用按钮看起来很难看,即使只有 0.3 秒。即使是为了他们自己的利益,用户也不会喜欢它。
所以基本上我必须快速启用重新启用按钮,而不是等到应用程序结束。
但是如何做到这一点,并且仍然制作出能够承受用户快速点击的强大应用程序呢?
我认为如果有人也可以解释“真正的”过渡何时完成,那将有所帮助。我的意思是从旧东西的超级视图中实际删除并添加到新东西的子视图中。动画只是一部不会真正改变过渡或视图结构的“电影”吗?