我正在尝试创建一个动画效果,其中UIBarButton会暂时更改为其他图像,然后再次更改。我正在使用故事板中创建的按钮。因为uibarbuttons继承自NSObject而不是UIView,所以我首先为uibarbutton分配一个常规按钮。这让我可以访问UIView的特性。一切正常。
要做动画,我连续做了四个动画。淡出第一个按钮,淡入第二个按钮,淡出第二个按钮并再次淡入第一个按钮。
问题是当第二个按钮加载时,它同时显示第一个按钮,将按钮相互叠加。这真的很奇怪,我无法弄清楚造成它的原因。这是代码:
//I. Fade out first image
[UIView animateWithDuration:0.2
delay:1.0
options: UIViewAnimationCurveEaseOut
animations:^{
self.hamburgerButton.customView.alpha=0;
}
completion:^(BOOL finished) {
//II. Fade in second image.
[self.hamButton setBackgroundImage:nil forState:UIControlStateNormal];
[self.hamButton setBackgroundImage:secondImage forState:UIControlStateNormal];
[UIView animateWithDuration:0.6
delay:0.0
options: UIViewAnimationCurveEaseOut
animations:^{
self.hamburgerButton.customView.alpha=1;
}
completion:^(BOOL finished) {
//III. Fade out second image
[UIView animateWithDuration:0.6
delay:0.0//was 2
options: UIViewAnimationCurveEaseOut
animations:^{
self.hamburgerButton.customView.alpha=0;
}
completion:^(BOOL finished) {
//IV. Fade in First Image
[self.hamButton setBackgroundImage:firstImage forState:UIControlStateNormal];
[UIView animateWithDuration:0.6
delay:0.0//was 2
options: UIViewAnimationCurveEaseOut
animations:^{
self.hamburgerButton.customView.alpha=1;
}
completion:^(BOOL finished) {
}];
}];
}];
}];
答案 0 :(得分:0)
不是设置相同按钮的图像,而是使用两个单独的按钮。在UIView中添加它们。将需要在背面褪色的那个放在alpha 0处,然后放在那个需要在alpha 1前面可见的那个。
点按前面按钮的alpha动画为零,同时将第二个按钮的alpha动画设为1.完成动画后,将按钮恢复到前面。
这是如何在obj-c中完成的:
@interface ViewController ()
@property (strong, nonatomic) IBOutlet UIBarButtonItem *barButtonItem;
@property (strong, nonatomic) UIView *customView;
@property (strong, nonatomic) UIButton *menuButton;
@property (strong, nonatomic) UIButton *closeMenuButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
_menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_menuButton setImage:[UIImage imageNamed:@"menu"] forState:UIControlStateNormal];
[_menuButton addTarget:self action:@selector(menuButtonTapped) forControlEvents:UIControlEventTouchUpInside];
_closeMenuButton = [UIButton buttonWithType:UIButtonTypeCustom];
[_closeMenuButton setImage:[UIImage imageNamed:@"menu-back"] forState:UIControlStateNormal];
[_closeMenuButton addTarget:self action:@selector(closeMenuButtonTapped) forControlEvents:UIControlEventTouchUpInside];
_closeMenuButton.alpha = 0.0;
_customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 30, 30)];
_closeMenuButton.frame = _customView.bounds;
_menuButton.frame = _customView.bounds;
[_customView addSubview:_closeMenuButton];
[_customView addSubview:_menuButton];
_barButtonItem.customView = _customView;
}
- (void)menuButtonTapped {
NSLog(@"Menu button tapped");
[UIView animateWithDuration:0.5 animations:^{
_menuButton.alpha = 0.0;
_closeMenuButton.alpha = 1.0;
} completion:^(BOOL finished) {
[_customView bringSubviewToFront:_closeMenuButton];
}];
}
- (void)closeMenuButtonTapped {
NSLog(@"Close menu button tapped");
[UIView animateWithDuration:0.5 animations:^{
_closeMenuButton.alpha = 0.0;
_menuButton.alpha = 1.0;
} completion:^(BOOL finished) {
[_customView bringSubviewToFront:_menuButton];
}];
}
@end
以下是我在Swift中实现的方法:
class ViewController: UIViewController {
@IBOutlet var barButtonItem: UIBarButtonItem!
let menuButton = UIButton.init(type: .custom)
let backMenuButton = UIButton(type: .custom)
let customView = UIView(frame: CGRect(x: 0, y: 0, width: 30, height: 30))
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
menuButton.setImage(#imageLiteral(resourceName: "menu"), for: .normal)
menuButton.addTarget(self, action: #selector(menuButtonTapped), for: .touchUpInside)
backMenuButton.setImage(#imageLiteral(resourceName: "menu-back"), for: .normal)
backMenuButton.addTarget(self, action: #selector(backMenuButtonTapped), for: .touchUpInside)
backMenuButton.frame = customView.bounds
customView.addSubview(backMenuButton)
backMenuButton.alpha = 0
menuButton.frame = customView.bounds
customView.addSubview(menuButton)
self.barButtonItem.customView = customView
}
@objc func menuButtonTapped() {
print("Menu button tapped")
UIView.animate(withDuration: 0.5, animations: {
self.menuButton.alpha = 0.0
self.backMenuButton.alpha = 1.0
}) { (finished) in
self.customView.bringSubview(toFront: self.backMenuButton)
}
}
@objc func backMenuButtonTapped() {
print("Back menu button tapped")
UIView.animate(withDuration: 0.5, animations: {
self.backMenuButton.alpha = 0.0
self.menuButton.alpha = 1.0
}) { (finished) in
self.customView.bringSubview(toFront: self.menuButton)
}
}
}
结果: