将 BarButtonItem 旋转 45 度(动画)
Rotate BarButtonItem by 45 degrees (animated)
看来动画不是我的专长:/
在我的导航栏中,我有一个自定义的 BarButtonItem,一个加号,用于向列表中添加内容。我想将加号旋转 45 度,使其在按下时变成 X,然后用作取消按钮。
我通过这样做向 BarButtonItem 添加了一个按钮作为自定义视图:
@IBOutlet weak var addQuestionaryButton: UIBarButtonItem!
{
didSet {
let icon = UIImage(named: "add")
let iconSize = CGRect(origin: CGPoint.zero, size: icon!.size)
let iconButton = UIButton(frame: iconSize)
iconButton.setBackgroundImage(icon, for: .normal)
addQuestionaryButton.customView = iconButton
iconButton.addTarget(self, action: #selector(QuestionaryListViewController.addClicked(_:)), for: .touchUpInside)
}
}
这似乎工作正常。
现在,如果按下按钮,我将执行以下操作:
UIView.animate(withDuration: 0.5, animations:{
self.addQuestionaryButton.customView!.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_4))
})
我可以看到按钮开始旋转,但不知何故它完全变形了。查看图片:
之前:
之后:
我不明白为什么会这样。
如何正确设置 BarButtonItem 的动画?
提前致谢。
问候
不知道为什么会这样(我的猜测是在进行转换时,customView 的框架会被弄乱)但找到了解决方案。
只需将按钮放入另一个 UIView,然后将此 UIView 设置为 UIBarButtonItem 的 customView。
做动画的时候,不要旋转UIView,旋转按钮。
提醒:不要忘记设置此 UIView 的框架。
Objective C中的示例代码:
初始化:
@interface ViewController ()
@property (nonatomic, strong) UIButton* itemButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//button init
self.itemButton = [[UIButton alloc] init];
[self.itemButton setBackgroundImage:[UIImage imageNamed:@"imgName"] forState:UIControlStateNormal];
self.itemButton.frame = CGRectMake(0, 0, 30, 30);
//container for the button
UIView* btnContainer = [[UIView alloc] init];
btnContainer.frame = CGRectMake(0, 0, 30, 30);
[btnContainer addSubview:self.itemButton];
//set the container as customView of the UIBarButtonItem
UIBarButtonItem* applyButton = [[UIBarButtonItem alloc] initWithCustomView:btnContainer];
self.navigationItem.rightBarButtonItem = applyButton;
}
触发旋转的代码:
[UIView animateWithDuration:0.5 animations:^{
self.itemButton.transform = CGAffineTransformRotate(self.itemButton.transform, M_PI_4);
}];
看来动画不是我的专长:/
在我的导航栏中,我有一个自定义的 BarButtonItem,一个加号,用于向列表中添加内容。我想将加号旋转 45 度,使其在按下时变成 X,然后用作取消按钮。
我通过这样做向 BarButtonItem 添加了一个按钮作为自定义视图:
@IBOutlet weak var addQuestionaryButton: UIBarButtonItem!
{
didSet {
let icon = UIImage(named: "add")
let iconSize = CGRect(origin: CGPoint.zero, size: icon!.size)
let iconButton = UIButton(frame: iconSize)
iconButton.setBackgroundImage(icon, for: .normal)
addQuestionaryButton.customView = iconButton
iconButton.addTarget(self, action: #selector(QuestionaryListViewController.addClicked(_:)), for: .touchUpInside)
}
}
这似乎工作正常。 现在,如果按下按钮,我将执行以下操作:
UIView.animate(withDuration: 0.5, animations:{
self.addQuestionaryButton.customView!.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_4))
})
我可以看到按钮开始旋转,但不知何故它完全变形了。查看图片:
之前:
之后:
我不明白为什么会这样。 如何正确设置 BarButtonItem 的动画?
提前致谢。
问候
不知道为什么会这样(我的猜测是在进行转换时,customView 的框架会被弄乱)但找到了解决方案。 只需将按钮放入另一个 UIView,然后将此 UIView 设置为 UIBarButtonItem 的 customView。
做动画的时候,不要旋转UIView,旋转按钮。
提醒:不要忘记设置此 UIView 的框架。
Objective C中的示例代码:
初始化:
@interface ViewController ()
@property (nonatomic, strong) UIButton* itemButton;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//button init
self.itemButton = [[UIButton alloc] init];
[self.itemButton setBackgroundImage:[UIImage imageNamed:@"imgName"] forState:UIControlStateNormal];
self.itemButton.frame = CGRectMake(0, 0, 30, 30);
//container for the button
UIView* btnContainer = [[UIView alloc] init];
btnContainer.frame = CGRectMake(0, 0, 30, 30);
[btnContainer addSubview:self.itemButton];
//set the container as customView of the UIBarButtonItem
UIBarButtonItem* applyButton = [[UIBarButtonItem alloc] initWithCustomView:btnContainer];
self.navigationItem.rightBarButtonItem = applyButton;
}
触发旋转的代码:
[UIView animateWithDuration:0.5 animations:^{
self.itemButton.transform = CGAffineTransformRotate(self.itemButton.transform, M_PI_4);
}];