更改UIButton帧会将其与IBAction选择器断开连接

时间:2016-09-13 10:49:35

标签: ios objective-c uibutton drawrect ibaction

我有一个包含UIButton的xib文件。我控制+拖动按钮来创建动作。必须动态设置按钮的位置。以下方法从drawRect:方法调用,该方法更新按钮位置。

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

但我注意到调用此函数会将UIButton与我通过控制+拖动创建的操作断开连接(即当我在应用程序运行时单击按钮时没有任何反应)。我评论了调用此函数的部分。现在按钮开始工作,并调用了action方法。因此,将UIButton的框架断开更改为其操作方法。

编辑:为其所有超级视图启用了用户交互。我没有使用自动布局。该项目就是这样。

如何更改按钮的框架,以便在单击按钮时调用操作?

3 个答案:

答案 0 :(得分:0)

使用超视图框检查按钮的框架。该按钮仅在其位于超视图框内时才接收触摸事件。

答案 1 :(得分:0)

无法重现您的问题,我拖了一个名为“btnAction”的动作和一个名为“btnTest”的插座。

这是ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

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

@end

这是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

尝试使用我的代码并告诉我问题出在哪里?

然后我可以帮助你。

答案 2 :(得分:0)

我的按钮框架位于其父视图的框架之外。因此它无法使用。

有关详细信息,请参阅UIButton not responding after set frame within UIScrollview