更改 UIButton 框架会断开它与 IBAction 选择器的连接

Changing UIButton frame disconnects it from IBAction selector

我有一个包含 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 与我通过控制 + 拖动创建的操作断开连接(即,当应用程序处于 运行 时单击按钮时没有任何反应)。我评论了调用此函数的部分。现在按钮开始工作并且调用了操作方法。因此,更改框架 断开 UIButton 与其操作方法的连接。

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

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

检查按钮的框架及其超级视图框架。只有当按钮驻留在其超级视图框架内时,该按钮才会接收触摸事件。

无法重现您的问题,我拖了一个名为 "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

试试用我的代码,告诉我问题出在哪里?

那我可以帮你

我的按钮的框架在其父视图的框架之外。因此它无法点击。

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