2016-09-13 2 views
0

J'ai un fichier xib qui contient un UIButton. Je contrôle + fait glisser le bouton pour créer une action. La position du bouton doit être définie dynamiquement. La méthode ci-dessous est appelée à partir de la méthode drawRect: qui met à jour la position du bouton.La modification du cadre UIButton le déconnecte du sélecteur IBAction

-(void)updateButtonPosition { 
    CGFloat xPos = self.label.frame.origin.x + self.label.frame.size.width; 
    CGFloat yPos = self.label.frame.origin.y + self.label.frame.size.height - 25; 
    CGRect frame = CGRectMake(xPos, yPos, self.button.frame.size.width, self.button.frame.size.height); 
    self.button.frame = frame; 
} 

Mais je remarquai que d'appeler cette fonction déconnecte le UIButton de l'action que j'ai créé par le contrôle + glisser (à savoir rien ne se passe lorsque je clique sur le bouton lorsque l'application est en cours d'exécution). J'ai commenté la partie où cette fonction a été appelée. Et maintenant le bouton a commencé à fonctionner et la méthode d'action a été appelée. Donc, en changeant le cadre déconnecté l'UIButton de sa méthode d'action.

EDIT: l'interaction utilisateur est activée pour tous ses aperçus. Je n'utilise pas la mise en page automatique. Le projet est comme ça.

Comment puis-je modifier l'image du bouton pour que l'action soit également appelée lorsque je clique sur le bouton?

+0

Essayez d'apporter votre touche à l'avant. –

+0

Il est déjà dans le front. – Rishab

+0

comment savez-vous que c'est __disconneted__? l'action a-t-elle été complètement supprimée? Je crois à peine que cette méthode ferait quelque chose comme ça, alors pourriez-vous élaborer s'il vous plaît? il est plus probable que lorsque vous mettez à jour les limites, vous placez le bouton en dehors des limites de sa vue d'ensemble. – holex

Répondre

0

Vérifiez le cadre du bouton avec son cadre supérieur. Le bouton ne reçoit les événements tactiles que lorsqu'il se trouve à l'intérieur de son cadre d'aperçu.

+0

Tous les bons là-bas. – Rishab

0

Impossible de reproduire votre problème, j'ai traîné une action nommée "btnAction" et une prise nommée "btnTest".

C'est ViewController.h

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

- (IBAction)btnAction:(id)sender; 
@property (weak, nonatomic) IBOutlet UIButton *btnTest; 

@end 

Et c'est ViewController.m

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
// [super viewDidLoad]; 
// // Do any additional setup after loading the view, typically from a nib. 

    [self.view addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(grHandler)]]; 
} 

-(void)grHandler{ 
    NSLog(@"grHandler actived."); 
    [self updateButtonPosition]; 
} 

- (IBAction)btnAction:(id)sender { 
    NSLog(@"btn actived."); 
} 

-(void)updateButtonPosition { 
    CGFloat xPos = 20; 
    CGFloat yPos = 30; 
    CGRect frame = CGRectMake(xPos, yPos, self.btnTest.frame.size.width, self.btnTest.frame.size.height); 
    self.btnTest.frame = frame; 
} 

@end 

Essayez d'utiliser mon code et me dire où est le problème?

Ensuite, je peux vous aider.

+0

La méthode d'action fonctionne mais 'grHandler' n'est jamais appelé. Pouvez-vous confirmer cela? – Rishab

+0

Ok son fonctionnement. J'ai dû taper sur la vue. : D Je ne sais toujours pas quel est le problème. Voici mon projet https://ufile.io/d6411 – Rishab

+0

Impossible d'obtenir votre fichier de code, pouvez-vous le mettre sur GitHub, alors je n'ai pas besoin de le télécharger. –