2017-01-20 1 views
2

ressemble à des animations ne sont pas ma spécialité:/Rotation BarButtonItem de 45 degrés (animés)

Dans ma barre de navigation, j'ai une coutume BarButtonItem, un plus, d'ajouter des choses à la liste. Je voulais faire tourner le plus de 45 degrés de sorte qu'il devienne un X quand il a été pressé et fonctionne comme un bouton d'annulation alors.

J'ai ajouté un bouton comme vue personnalisée à l'BarButtonItem en faisant ceci:

@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) 
    } 
} 

Cela semble fonctionner très bien. Maintenant, si le bouton est enfoncé, je procédez comme suit:

UIView.animate(withDuration: 0.5, animations:{ 
      self.addQuestionaryButton.customView!.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI_4)) 
     }) 

Je peux voir le bouton de commencer à tourner, mais en quelque sorte, il devient totalement déformé. Voir les photos pour que:

Avant:

Normal state, before it is pressed

Après:

enter image description here

Je ne comprends pas pourquoi cela se produit. Comment animer correctement le BarButtonItem?

Merci d'avance.

Salutations

Répondre

4

Je ne sais pas pourquoi cela se passe (je suppose en fait la transformation, le cadre du CustomView sera foiré) mais a trouvé une solution. Placez simplement le bouton dans un autre UIView, puis définissez ce UIView comme customView du UIBarButtonItem. Lorsque vous faites l'animation, ne faites pas pivoter l'UIView, tournez le bouton. Rappel: N'oubliez pas de définir le cadre de ce UIView.

Exemple de code en Objective C:
Init:

@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; 
} 

code pour déclencher la rotation:

[UIView animateWithDuration:0.5 animations:^{ 
     self.itemButton.transform = CGAffineTransformRotate(self.itemButton.transform, M_PI_4); 
}]; 
+0

Salut désolé pour la réponse tardive, j'ai eu un week-end chargé. Je vais essayer ça ce soir et je vous le ferai savoir. Merci. –

+0

@Hardcore_Graverobber NVM, exemple de code ajouté FYI – jokeman

+0

Très bien, merci beaucoup, cela a fonctionné parfaitement. Vous vous demandez toujours pourquoi cela n'a pas fonctionné en premier lieu mais maintenant c'est bon! –