如何在UINavigationBar中实现按钮变化的动画效果?

38

我在我的代码中调用-(void)setEditing:(BOOL)editing animated:(BOOL)animated方法,以在我的导航栏右侧两个按钮之间进行切换。

-(void)setEditing:(BOOL)editing animated:(BOOL)animated {  
  [super setEditing:editing animated:animated];  

  // Toggle ‘+’ and ‘Add To Order’ button.    

  if( editing ) {
    self.navigationItem.rightBarButtonItem = self.addItemButton;  
  }  
  else {           
    self.navigationItem.rightBarButtonItem = self.addToOrderButton;  
  } 
}

awakefromNib中设置了预定义的UIBarButtonItems,其中self.addItemButtonself.addToOrderButton是实例变量。

self.addToOrderButton中的按钮比self.addItemButton中的按钮要宽得多,因此我希望在编辑状态发生更改时(通过在导航栏左侧的标准editButtonItem上轻按触发),它们之间有一个微妙的宽度动画。

如果我将整个if:else语句用[UIView beginAnimations:nil context:NULL];[UIView commitAnimations];包围起来,则按钮更改会进行动画处理,但它们的位置会从左上角分别飞入到指定位置,而不是在原地并且只是动画化宽度。

我该如何对导航栏元素进行动画处理,使每个单独的元素(RHS按钮、标题)以更合适、更克制的方式动画化?

1个回答

78
self.navigationItem.rightBarButtonItem = self.addToOrderButton; 
有特定的方法可以用来动画化右边和左边的导航栏按钮项:
 [self.navigationItem setRightBarButtonItem: self.addToOrderButton animated:YES];

如果你想要动画效果(包括标题),可以使用导航栏的setItems:animated:方法(将要显示的导航项传递给它的数组中),它会帮你完成动画效果。


1
SDK中没有直接的方法。你可能可以自己实现一些东西,但这并不容易(比如通过类别重写方法并用自己的转换替换它)。 - lxt
如果您不知道如何操作,可以使用以下代码: [self.navigationItem setLeftBarButtonItem:nil animated:YES];这段代码可以与以下代码结合使用: [self.navigationItem setHidesBackButton:NO animated:YES]; - richy
对于自定义动画,最简单的方法不是将导航栏替换为自定义视图吗? - User
2
在尝试使用 setItems:animated: 之前,请注意它不能用于 navigationControllernavigationBar 上。否则,您将会遇到以下异常:Cannot call setItems:animated: directly on a UINavigationBar managed by a controller. - Andrii Chernenko
将您的方法更新为Swift 5`var rightBarbuttonItemsArray: [UIBarButtonItem] = []self.navigationItem.setRightBarButtonItems(rightBarbuttonItemsArray, animated: true)` - Mehdi S.
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接